{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "STuxHh6kk3eL"
      },
      "source": [
        "# Classify text with embeddings\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "wUmTFPw2W_UD"
      },
      "source": [
        "<table align=\"left\">\n",
        "  <td>\n",
        "    <a target=\"_blank\" href=\"https://colab.research.google.com/github/google-gemini/cookbook/blob/main/examples/Classify_text_with_embeddings.ipynb\"><img src=\"https://www.tensorflow.org/images/colab_logo_32px.png\" />Run in Google Colab</a>\n",
        "  </td>\n",
        "</table>"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "bhT1u-Pof10V"
      },
      "source": [
        "## Overview\n",
        "\n",
        "In this notebook, you'll learn to use the embeddings produced by the Gemini API to train a model that can classify different types of newsgroup posts based on the topic.\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "FXq0ygI3BCdQ"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "\u001b[?25l     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m0.0/137.4 kB\u001b[0m \u001b[31m?\u001b[0m eta \u001b[36m-:--:--\u001b[0m\r\u001b[2K     \u001b[91m━━\u001b[0m\u001b[91m╸\u001b[0m\u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m10.2/137.4 kB\u001b[0m \u001b[31m?\u001b[0m eta \u001b[36m-:--:--\u001b[0m\r\u001b[2K     \u001b[91m━━━━━━━━━━━━━━━━━\u001b[0m\u001b[91m╸\u001b[0m\u001b[90m━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m61.4/137.4 kB\u001b[0m \u001b[31m923.1 kB/s\u001b[0m eta \u001b[36m0:00:01\u001b[0m\r\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m137.4/137.4 kB\u001b[0m \u001b[31m1.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25h"
          ]
        }
      ],
      "source": [
        "!pip install -U -q google.generativeai"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "XiJjB2vWCQJP"
      },
      "outputs": [],
      "source": [
        "import re\n",
        "import tqdm\n",
        "import keras\n",
        "import numpy as np\n",
        "import pandas as pd\n",
        "\n",
        "import google.generativeai as genai\n",
        "import google.ai.generativelanguage as glm\n",
        "\n",
        "from google.colab import userdata\n",
        "\n",
        "import seaborn as sns\n",
        "import matplotlib.pyplot as plt\n",
        "\n",
        "from keras import layers\n",
        "from matplotlib.ticker import MaxNLocator\n",
        "from sklearn.datasets import fetch_20newsgroups\n",
        "import sklearn.metrics as skmetrics"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "_mwJYXpElYJc"
      },
      "source": [
        "To run the following cell, your API key must be stored it in a Colab Secret named `GOOGLE_API_KEY`. If you don't already have an API key, or you're not sure how to create a Colab Secret, see the [Authentication](https://github.com/google-gemini/cookbook/blob/main/quickstarts/Authentication.ipynb) quickstart for an example."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "tayrk_A2lZ7A"
      },
      "outputs": [],
      "source": [
        "API_KEY=userdata.get('GOOGLE_API_KEY')\n",
        "genai.configure(api_key=API_KEY)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "C5B9sWq0hNEV"
      },
      "source": [
        "## Dataset\n",
        "\n",
        "The [20 Newsgroups Text Dataset](https://scikit-learn.org/0.19/datasets/twenty_newsgroups.html){:.external} contains 18,000 newsgroups posts on 20 topics divided into training and test sets. The split between the training and test datasets are based on messages posted before and after a specific date. For this tutorial, you will be using the subsets of the training and test datasets. You will preprocess and organize the data into Pandas dataframes."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "jDoKis4om-Ea"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "['alt.atheism',\n",
              " 'comp.graphics',\n",
              " 'comp.os.ms-windows.misc',\n",
              " 'comp.sys.ibm.pc.hardware',\n",
              " 'comp.sys.mac.hardware',\n",
              " 'comp.windows.x',\n",
              " 'misc.forsale',\n",
              " 'rec.autos',\n",
              " 'rec.motorcycles',\n",
              " 'rec.sport.baseball',\n",
              " 'rec.sport.hockey',\n",
              " 'sci.crypt',\n",
              " 'sci.electronics',\n",
              " 'sci.med',\n",
              " 'sci.space',\n",
              " 'soc.religion.christian',\n",
              " 'talk.politics.guns',\n",
              " 'talk.politics.mideast',\n",
              " 'talk.politics.misc',\n",
              " 'talk.religion.misc']"
            ]
          },
          "execution_count": 5,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "newsgroups_train = fetch_20newsgroups(subset='train')\n",
        "newsgroups_test = fetch_20newsgroups(subset='test')\n",
        "\n",
        "# View list of class names for dataset\n",
        "newsgroups_train.target_names"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "hDz9MjkNl_FD"
      },
      "source": [
        "Here is an example of what a data point from the training set looks like."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "FPq-56AimOPX"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Lines: 15\n",
            "\n",
            " I was wondering if anyone out there could enlighten me on this car I saw\n",
            "the other day. It was a 2-door sports car, looked to be from the late 60s/\n",
            "early 70s. It was called a Bricklin. The doors were really small. In addition,\n",
            "the front bumper was separate from the rest of the body. This is \n",
            "all I know. If anyone can tellme a model name, engine specs, years\n",
            "of production, where this car is made, history, or whatever info you\n",
            "have on this funky looking car, please e-mail.\n",
            "\n",
            "Thanks,\n",
            "- IL\n",
            "   ---- brought to you by your neighborhood Lerxst ----\n",
            "\n",
            "\n",
            "\n",
            "\n",
            "\n"
          ]
        }
      ],
      "source": [
        "idx = newsgroups_train.data[0].index('Lines')\n",
        "print(newsgroups_train.data[0][idx:])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "A9-DD7wgCx8j"
      },
      "source": [
        "Now you will begin preprocessing the data for this tutorial. Remove any sensitive information like names, email, or redundant parts of the text like `\"From: \"` and `\"\\nSubject: \"`. Organize the information into a Pandas dataframe so it is more readable."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "urpLwp3UmPF3"
      },
      "outputs": [],
      "source": [
        "def preprocess_newsgroup_data(newsgroup_dataset):\n",
        "  # Apply functions to remove names, emails, and extraneous words from data points in newsgroups.data\n",
        "  newsgroup_dataset.data = [re.sub(r'[\\w\\.-]+@[\\w\\.-]+', '', d) for d in newsgroup_dataset.data] # Remove email\n",
        "  newsgroup_dataset.data = [re.sub(r\"\\([^()]*\\)\", \"\", d) for d in newsgroup_dataset.data] # Remove names\n",
        "  newsgroup_dataset.data = [d.replace(\"From: \", \"\") for d in newsgroup_dataset.data] # Remove \"From: \"\n",
        "  newsgroup_dataset.data = [d.replace(\"\\nSubject: \", \"\") for d in newsgroup_dataset.data] # Remove \"\\nSubject: \"\n",
        "\n",
        "  # Cut off each text entry after 5,000 characters\n",
        "  newsgroup_dataset.data = [d[0:5000] if len(d) > 5000 else d for d in newsgroup_dataset.data]\n",
        "\n",
        "  # Put data points into dataframe\n",
        "  df_processed = pd.DataFrame(newsgroup_dataset.data, columns=['Text'])\n",
        "  df_processed['Label'] = newsgroup_dataset.target\n",
        "  # Match label to target name index\n",
        "  df_processed['Class Name'] = ''\n",
        "  for idx, row in df_processed.iterrows():\n",
        "    df_processed.at[idx, 'Class Name'] = newsgroup_dataset.target_names[row['Label']]\n",
        "\n",
        "  return df_processed"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "JMKddQdNnAOV"
      },
      "outputs": [
        {
          "data": {
            "application/vnd.google.colaboratory.intrinsic+json": {
              "summary": "{\n  \"name\": \"df_train\",\n  \"rows\": 11314,\n  \"fields\": [\n    {\n      \"column\": \"Text\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 11314,\n        \"samples\": [\n          \" CYCLONE AND TEMPEST?????\\nArticle-I.D.: usenet.1pskav$qtu\\nReply-To:  \\nOrganization: Case Western Reserve University, Cleveland, OH \\nLines: 10\\nNNTP-Posting-Host: thor.ins.cwru.edu\\n\\n\\nCould someone please post any info on these systems.\\n\\nThanks.\\nBoB\\n-- \\n---------------------------------------------------------------------- \\nRobert Novitskey | \\\"Pursuing women is similar to banging one's head\\n  |  against a wall...with less opportunity for reward\\\" \\n---------------------------------------------------------------------- \\n\",\n          \" Re: does dos6 defragment??\\nArticle-I.D.: ux1.ardie.272.734097933\\nOrganization: Department of Plant Pathology\\nLines: 30\\n\\nIn article <>   writes:\\n> \\n>Subject: Re: does dos6 defragment??\\n>Date: Tue, 6 Apr 1993 04:02:54 GMT\\n>In article <>,   writes:\\n>|> Geoffrey S. Elbo writes:\\n>|> \\n>|> >Yes, and it is the fastest defrag I've ever watched.  It did a 170MB \\n>|> >hard disk in 20 minutes.\\n>|> \\n>|> \\tI found the MS defrag looks very much like Norton Speedisk.\\n>|> Is it just a strip-down version of the later?\\n>|> \\n>|> \\tI have both Norton Speedisk and Backup, so I was wondering \\n>|> if I need to install MS Backup?\\n>|> \\n>|> Richard\\n>|> \\n>\\n>Yes, defragger IS come from Norton.\\n>If you have Norton Utility, don't bother.\\n\\n\\n     Don't bother if you have CPBackup or Fastback.  They all offer options \\nnot available in the stripped-down MS version .  Examples - no \\nproprietary format , probably no direct DMA access, and no \\ntape drive!\\n\\n     You NEED MS Defrag if you use doublespace to work on the compressed \\nvolume.\\n\",\n          \" For Sale:  Misc IBM stuff\\nOrganization: The Cellar BBS and public access system\\nLines: 10\\n\\n5.25\\\" Internal Low density disk drive.\\n\\nMonochrome monitor\\n\\n8088 motherboard, built in parallel and serial ports, built in mono and\\ncolor output, 7Mhz.\\n\\nLibertarian, atheist, semi-anarchal Techno-Rat.\\n\\nI define \\n\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Label\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 5,\n        \"min\": 0,\n        \"max\": 19,\n        \"num_unique_values\": 20,\n        \"samples\": [\n          7,\n          17,\n          9\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Class Name\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 20,\n        \"samples\": [\n          \"rec.autos\",\n          \"talk.politics.mideast\",\n          \"rec.sport.baseball\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}",
              "type": "dataframe",
              "variable_name": "df_train"
            },
            "text/html": [
              "\n",
              "  <div id=\"df-d0553452-c321-43fb-a6e6-7b860ac3ce3d\" class=\"colab-df-container\">\n",
              "    <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>Text</th>\n",
              "      <th>Label</th>\n",
              "      <th>Class Name</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>WHAT car is this!?\\nNntp-Posting-Host: rac3.w...</td>\n",
              "      <td>7</td>\n",
              "      <td>rec.autos</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>SI Clock Poll - Final Call\\nSummary: Final ca...</td>\n",
              "      <td>4</td>\n",
              "      <td>comp.sys.mac.hardware</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>PB questions...\\nOrganization: Purdue Univers...</td>\n",
              "      <td>4</td>\n",
              "      <td>comp.sys.mac.hardware</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>Re: Weitek P9000 ?\\nOrganization: Harris Comp...</td>\n",
              "      <td>1</td>\n",
              "      <td>comp.graphics</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>Re: Shuttle Launch Question\\nOrganization: Sm...</td>\n",
              "      <td>14</td>\n",
              "      <td>sci.space</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-d0553452-c321-43fb-a6e6-7b860ac3ce3d')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-d0553452-c321-43fb-a6e6-7b860ac3ce3d button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-d0553452-c321-43fb-a6e6-7b860ac3ce3d');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "<div id=\"df-c2084e46-4f94-4d1f-8f53-45ebf394731c\">\n",
              "  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-c2084e46-4f94-4d1f-8f53-45ebf394731c')\"\n",
              "            title=\"Suggest charts\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\">\n",
              "    <g>\n",
              "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
              "    </g>\n",
              "</svg>\n",
              "  </button>\n",
              "\n",
              "<style>\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "</style>\n",
              "\n",
              "  <script>\n",
              "    async function quickchart(key) {\n",
              "      const quickchartButtonEl =\n",
              "        document.querySelector('#' + key + ' button');\n",
              "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "      try {\n",
              "        const charts = await google.colab.kernel.invokeFunction(\n",
              "            'suggestCharts', [key], {});\n",
              "      } catch (error) {\n",
              "        console.error('Error during call to suggestCharts:', error);\n",
              "      }\n",
              "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "    }\n",
              "    (() => {\n",
              "      let quickchartButtonEl =\n",
              "        document.querySelector('#df-c2084e46-4f94-4d1f-8f53-45ebf394731c button');\n",
              "      quickchartButtonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "    })();\n",
              "  </script>\n",
              "</div>\n",
              "\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "text/plain": [
              "                                                Text  Label  \\\n",
              "0   WHAT car is this!?\\nNntp-Posting-Host: rac3.w...      7   \n",
              "1   SI Clock Poll - Final Call\\nSummary: Final ca...      4   \n",
              "2   PB questions...\\nOrganization: Purdue Univers...      4   \n",
              "3   Re: Weitek P9000 ?\\nOrganization: Harris Comp...      1   \n",
              "4   Re: Shuttle Launch Question\\nOrganization: Sm...     14   \n",
              "\n",
              "              Class Name  \n",
              "0              rec.autos  \n",
              "1  comp.sys.mac.hardware  \n",
              "2  comp.sys.mac.hardware  \n",
              "3          comp.graphics  \n",
              "4              sci.space  "
            ]
          },
          "execution_count": 8,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Apply preprocessing function to training and test datasets\n",
        "df_train = preprocess_newsgroup_data(newsgroups_train)\n",
        "df_test = preprocess_newsgroup_data(newsgroups_test)\n",
        "\n",
        "df_train.head()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "ogEGbg5XDv-T"
      },
      "source": [
        "Next, you will sample some of the data by taking 100 data points in the training dataset, and dropping a few of the categories to run through this tutorial. Choose the science categories to compare."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "C2N7xXhJohLR"
      },
      "outputs": [],
      "source": [
        "def sample_data(df, num_samples, classes_to_keep):\n",
        "  df = df.groupby('Label', as_index = False).apply(lambda x: x.sample(num_samples)).reset_index(drop=True)\n",
        "\n",
        "  df = df[df['Class Name'].str.contains(classes_to_keep)]\n",
        "\n",
        "  # Reset the encoding of the labels after sampling and dropping certain categories\n",
        "  df['Class Name'] = df['Class Name'].astype('category')\n",
        "  df['Encoded Label'] = df['Class Name'].cat.codes\n",
        "\n",
        "  return df"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "jS2g_ZGupBUb"
      },
      "outputs": [],
      "source": [
        "TRAIN_NUM_SAMPLES = 100\n",
        "TEST_NUM_SAMPLES = 25\n",
        "CLASSES_TO_KEEP = 'sci' # Class name should contain 'sci' in it to keep science categories\n",
        "df_train = sample_data(df_train, TRAIN_NUM_SAMPLES, CLASSES_TO_KEEP)\n",
        "df_test = sample_data(df_test, TEST_NUM_SAMPLES, CLASSES_TO_KEEP)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "j04TMPY8rV5q"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "Class Name\n",
              "sci.crypt          100\n",
              "sci.electronics    100\n",
              "sci.med            100\n",
              "sci.space          100\n",
              "dtype: int64"
            ]
          },
          "execution_count": 11,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "df_train.value_counts('Class Name')"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "qMsnfkVDsJlU"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "Class Name\n",
              "sci.crypt          25\n",
              "sci.electronics    25\n",
              "sci.med            25\n",
              "sci.space          25\n",
              "dtype: int64"
            ]
          },
          "execution_count": 12,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "df_test.value_counts('Class Name')"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Kr-WlKzXjYWn"
      },
      "source": [
        "## Create the embeddings\n",
        "\n",
        "In this section, you will see how to generate embeddings for a piece of text using the embeddings from the Gemini API. To learn more about embeddings, visit the [embeddings guide](https://ai.google.dev/docs/embeddings_guide).\n",
        "\n",
        "**NOTE**: Embeddings are computed one at a time, large sample sizes can take a long time!"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "yPECMeE2xYA_"
      },
      "source": [
        "### API changes to Embeddings embedding-001\n",
        "\n",
        "For the new embeddings model, there is a new task type parameter and the optional title (only valid with task_type=`RETRIEVAL_DOCUMENT`).\n",
        "\n",
        "These new parameters apply only to the newest embeddings models.The task types are:\n",
        "\n",
        "Task Type | Description\n",
        "---       | ---\n",
        "RETRIEVAL_QUERY\t| Specifies the given text is a query in a search/retrieval setting.\n",
        "RETRIEVAL_DOCUMENT | Specifies the given text is a document in a search/retrieval setting.\n",
        "SEMANTIC_SIMILARITY\t| Specifies the given text will be used for Semantic Textual Similarity (STS).\n",
        "CLASSIFICATION\t| Specifies that the embeddings will be used for classification.\n",
        "CLUSTERING\t| Specifies that the embeddings will be used for clustering."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "MTBGKkPQsotz"
      },
      "outputs": [],
      "source": [
        "from tqdm.auto import tqdm\n",
        "tqdm.pandas()\n",
        "\n",
        "from google.api_core import retry\n",
        "\n",
        "def make_embed_text_fn(model):\n",
        "\n",
        "  @retry.Retry(timeout=300.0)\n",
        "  def embed_fn(text: str) -> list[float]:\n",
        "    # Set the task_type to CLASSIFICATION.\n",
        "    embedding = genai.embed_content(model=model,\n",
        "                                    content=text,\n",
        "                                    task_type=\"classification\")\n",
        "    return embedding['embedding']\n",
        "\n",
        "  return embed_fn\n",
        "\n",
        "def create_embeddings(model, df):\n",
        "  df['Embeddings'] = df['Text'].progress_apply(make_embed_text_fn(model))\n",
        "  return df"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "AH0yrHUHtHtw"
      },
      "outputs": [
        {
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "dc8faa8bc2c64618af9e9e7dc70e56bd",
              "version_major": 2,
              "version_minor": 0
            },
            "text/plain": [
              "  0%|          | 0/400 [00:00<?, ?it/s]"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        },
        {
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "77ceb22588d44aceb23bf0cc6f1a63f8",
              "version_major": 2,
              "version_minor": 0
            },
            "text/plain": [
              "  0%|          | 0/100 [00:00<?, ?it/s]"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "model = 'models/embedding-001'\n",
        "df_train = create_embeddings(model, df_train)\n",
        "df_test = create_embeddings(model, df_test)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "6G5TvLlmRjHc"
      },
      "outputs": [
        {
          "data": {
            "application/vnd.google.colaboratory.intrinsic+json": {
              "summary": "{\n  \"name\": \"df_train\",\n  \"rows\": 400,\n  \"fields\": [\n    {\n      \"column\": \"Text\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 400,\n        \"samples\": [\n          \" Re: Foreskin Troubles\\nSummary: Dorsal slit operation\\nArticle-I.D.: pegasus.1993Apr22.221111.9678\\nOrganization: Pegasus,  Honolulu\\nLines: 11\\n\\nIn article <>   writes:\\n>What can be done, short of circumcision, for an adult male\\n>whose foreskin will not retract?\\n>\\nMelissa, there is a simpler procedure called a \\\"Dorsal slit\\\" that is\\nreally the first step of the usual circumcision.  It is simpler and\\nquicker, but the pain is about the same as circumcision after the\\nanesthetic wears off and the aesthetic result post healing is not as\\ngood.  See your friendly urologist for more details.\\n                                                Len Howard\\n.\\n\",\n          \" Re: Human breast-feeding : Myths or reality ?\\nOrganization: AT&T\\nSummary: experience with three children\\nLines: 32\\n\\nIn article <>,   writes:\\n>   writes:\\n> \\n> I have an additional question. How long should a mother breast feed her\\n> child? A friend of mine is still nursing her two year old. Is this beneficial?\\n> Her ex-husband is trying to use her coninued nursing of a two year old as\\n> \\\"proof\\\" of her being unfit to be a mother. What studies have been done\\n> on breast feeding past a year etc... upon the psychological health of the\\n> child? \\n> \\n> \\n> Web Homer\\n> \\n\\nMy wife breast-fed my three boys 12 months, 16 months, and 29 months\\nrespectively and they are 18, 16, and 10 years old respectively.  So\\nfar everybody seems fairly normal.  I noticed a negative correlation\\nwith ear infections and length of time nursed in my very small sample.\\nI do notice that the 16 and 18 year old seem to eat a lot, could that\\nbe from the breast feeding :-)  ?\\n\\nI don't understand the \\\"unfit mother\\\" charge other than any tactic is\\nnot too low down for some folks during divorce/child custody battles.\\n\\nMost of the developing nations practice breast feeding to 3 and 4 years\\nold.  Are they screwed up because of it ?  Would they be much better\\noff if they could use cow's milk or commercial formula ?  Doctors ?\\n\\nBobby - akgua!rjb\\n\\n\\n\\n\",\n          \" Re: Screw the people, crypto is for hard-core hackers & spooks only \\nOrganization: DSI/USCRPAC\\nLines: 25\\n\\nIn article <>   writes:\\n\\n>\\n>What we need is a true *privacy chip*.  For example, a real-time \\n>voice-encryption RSA, silicon compile it and spit out ASIC.  \\n>Put this chip on the market as a de facto standard for international \\n>business, diplomats, and private communications.  If the U.S. bans \\n>it, we make it somewhere else and import it.  The Japanese, German,\\n>Dutch, Taiwanese, Korean, etc. electronics companies don't want the \\n>NSA spying on them.  U.S. workers lose more jobs to government fascist\\n>stupidity.\\n>\\n\\nSome countries have laws about importing crypto gear--I believe the U.S.\\ndoes. Without a license the above scheme won't work \\nin such countries, including at least France and the U.S.\\n\\nDavid\\n\\n\\n-- \\nDavid Sternlight         Great care has been taken to ensure the accuracy of\\n                         our information, errors and omissions excepted.  \\n\\n\\n\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Label\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 1,\n        \"min\": 11,\n        \"max\": 14,\n        \"num_unique_values\": 4,\n        \"samples\": [\n          12,\n          14,\n          11\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Class Name\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 4,\n        \"samples\": [\n          \"sci.electronics\",\n          \"sci.space\",\n          \"sci.crypt\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Encoded Label\",\n      \"properties\": {\n        \"dtype\": \"int8\",\n        \"num_unique_values\": 4,\n        \"samples\": [\n          1,\n          3,\n          0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Embeddings\",\n      \"properties\": {\n        \"dtype\": \"object\",\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}",
              "type": "dataframe",
              "variable_name": "df_train"
            },
            "text/html": [
              "\n",
              "  <div id=\"df-c76c2eaa-78f0-44a6-beef-dc01e2652c8b\" class=\"colab-df-container\">\n",
              "    <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>Text</th>\n",
              "      <th>Label</th>\n",
              "      <th>Class Name</th>\n",
              "      <th>Encoded Label</th>\n",
              "      <th>Embeddings</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>1100</th>\n",
              "      <td>Clipper will corrupt cops \\nReply-To: \\nOrgan...</td>\n",
              "      <td>11</td>\n",
              "      <td>sci.crypt</td>\n",
              "      <td>0</td>\n",
              "      <td>[0.010633712, -0.021571046, -0.045835823, -0.0...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1101</th>\n",
              "      <td>Re: Secret algorithm [Re: Clipper Chip and cr...</td>\n",
              "      <td>11</td>\n",
              "      <td>sci.crypt</td>\n",
              "      <td>0</td>\n",
              "      <td>[0.0045358823, -0.013263639, -0.0868885, -0.06...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1102</th>\n",
              "      <td>Is there ANY security in the Clipper?\\nOrgani...</td>\n",
              "      <td>11</td>\n",
              "      <td>sci.crypt</td>\n",
              "      <td>0</td>\n",
              "      <td>[-0.00787702, -0.028792221, -0.08031126, -0.04...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1103</th>\n",
              "      <td>Re: Organized Lobbying for Cryptography\\nOrga...</td>\n",
              "      <td>11</td>\n",
              "      <td>sci.crypt</td>\n",
              "      <td>0</td>\n",
              "      <td>[0.010175458, -0.018603686, -0.077447176, -0.0...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1104</th>\n",
              "      <td>Overreacting \\nNntp-Posting-Host: debra.dgbt....</td>\n",
              "      <td>11</td>\n",
              "      <td>sci.crypt</td>\n",
              "      <td>0</td>\n",
              "      <td>[-0.01906553, -0.02596697, -0.036176518, -0.01...</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-c76c2eaa-78f0-44a6-beef-dc01e2652c8b')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-c76c2eaa-78f0-44a6-beef-dc01e2652c8b button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-c76c2eaa-78f0-44a6-beef-dc01e2652c8b');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "<div id=\"df-3d2b4956-85ac-4fee-bdac-f619ad799cc4\">\n",
              "  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-3d2b4956-85ac-4fee-bdac-f619ad799cc4')\"\n",
              "            title=\"Suggest charts\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\">\n",
              "    <g>\n",
              "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
              "    </g>\n",
              "</svg>\n",
              "  </button>\n",
              "\n",
              "<style>\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "</style>\n",
              "\n",
              "  <script>\n",
              "    async function quickchart(key) {\n",
              "      const quickchartButtonEl =\n",
              "        document.querySelector('#' + key + ' button');\n",
              "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "      try {\n",
              "        const charts = await google.colab.kernel.invokeFunction(\n",
              "            'suggestCharts', [key], {});\n",
              "      } catch (error) {\n",
              "        console.error('Error during call to suggestCharts:', error);\n",
              "      }\n",
              "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "    }\n",
              "    (() => {\n",
              "      let quickchartButtonEl =\n",
              "        document.querySelector('#df-3d2b4956-85ac-4fee-bdac-f619ad799cc4 button');\n",
              "      quickchartButtonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "    })();\n",
              "  </script>\n",
              "</div>\n",
              "\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "text/plain": [
              "                                                   Text  Label Class Name  \\\n",
              "1100   Clipper will corrupt cops \\nReply-To: \\nOrgan...     11  sci.crypt   \n",
              "1101   Re: Secret algorithm [Re: Clipper Chip and cr...     11  sci.crypt   \n",
              "1102   Is there ANY security in the Clipper?\\nOrgani...     11  sci.crypt   \n",
              "1103   Re: Organized Lobbying for Cryptography\\nOrga...     11  sci.crypt   \n",
              "1104   Overreacting \\nNntp-Posting-Host: debra.dgbt....     11  sci.crypt   \n",
              "\n",
              "      Encoded Label                                         Embeddings  \n",
              "1100              0  [0.010633712, -0.021571046, -0.045835823, -0.0...  \n",
              "1101              0  [0.0045358823, -0.013263639, -0.0868885, -0.06...  \n",
              "1102              0  [-0.00787702, -0.028792221, -0.08031126, -0.04...  \n",
              "1103              0  [0.010175458, -0.018603686, -0.077447176, -0.0...  \n",
              "1104              0  [-0.01906553, -0.02596697, -0.036176518, -0.01...  "
            ]
          },
          "execution_count": 15,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "df_train.head()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "QPYEYkIsWt_5"
      },
      "source": [
        "## Build a simple classification model\n",
        "Here you will define a simple model with one hidden layer and a single class probability output. The prediction will correspond to the probability of a piece of text being a particular class of news. When you build your model, Keras will automatically shuffle the data points."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "3oLGi4w5JsQR"
      },
      "outputs": [],
      "source": [
        "def build_classification_model(input_size: int, num_classes: int) -> keras.Model:\n",
        "  inputs = x = keras.Input(input_size)\n",
        "  x = layers.Dense(input_size, activation='relu')(x)\n",
        "  x = layers.Dense(num_classes, activation='sigmoid')(x)\n",
        "  return keras.Model(inputs=[inputs], outputs=x)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "kORA1Akl5GsG"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Model: \"model\"\n",
            "_________________________________________________________________\n",
            " Layer (type)                Output Shape              Param #   \n",
            "=================================================================\n",
            " input_1 (InputLayer)        [(None, 768)]             0         \n",
            "                                                                 \n",
            " dense (Dense)               (None, 768)               590592    \n",
            "                                                                 \n",
            " dense_1 (Dense)             (None, 4)                 3076      \n",
            "                                                                 \n",
            "=================================================================\n",
            "Total params: 593668 (2.26 MB)\n",
            "Trainable params: 593668 (2.26 MB)\n",
            "Non-trainable params: 0 (0.00 Byte)\n",
            "_________________________________________________________________\n"
          ]
        }
      ],
      "source": [
        "# Derive the embedding size from the first training element.\n",
        "embedding_size = len(df_train['Embeddings'].iloc[0])\n",
        "\n",
        "# Give your model a different name, as you have already used the variable name 'model'\n",
        "classifier = build_classification_model(embedding_size, len(df_train['Class Name'].unique()))\n",
        "classifier.summary()\n",
        "\n",
        "classifier.compile(loss = keras.losses.SparseCategoricalCrossentropy(from_logits=True),\n",
        "                   optimizer = keras.optimizers.Adam(learning_rate=0.001),\n",
        "                   metrics=['accuracy'])"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "iPYYKnqFvt9x"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "768"
            ]
          },
          "execution_count": 18,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "embedding_size"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "kbpTGGiMXDxl"
      },
      "source": [
        "## Train the model to classify newsgroups\n",
        "\n",
        "Finally, you can train a simple model. Use a small number of epochs to avoid overfitting. The first epoch takes much longer than the rest, because the embeddings need to be computed only once."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "bGgvMZGfJ1A4"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Epoch 1/20\n"
          ]
        },
        {
          "name": "stderr",
          "output_type": "stream",
          "text": [
            "/usr/local/lib/python3.10/dist-packages/keras/src/backend.py:5727: UserWarning: \"`sparse_categorical_crossentropy` received `from_logits=True`, but the `output` argument was produced by a Softmax activation and thus does not represent logits. Was this intended?\n",
            "  output, from_logits = _get_logits(\n"
          ]
        },
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "13/13 [==============================] - 1s 29ms/step - loss: 1.2285 - accuracy: 0.6075 - val_loss: 1.0068 - val_accuracy: 0.8900\n",
            "Epoch 2/20\n",
            "13/13 [==============================] - 0s 11ms/step - loss: 0.7928 - accuracy: 0.9075 - val_loss: 0.6154 - val_accuracy: 0.9400\n",
            "Epoch 3/20\n",
            "13/13 [==============================] - 0s 10ms/step - loss: 0.4425 - accuracy: 0.9600 - val_loss: 0.3613 - val_accuracy: 0.9500\n",
            "Epoch 4/20\n",
            "13/13 [==============================] - 0s 11ms/step - loss: 0.2540 - accuracy: 0.9675 - val_loss: 0.2266 - val_accuracy: 0.9500\n",
            "Epoch 5/20\n",
            "13/13 [==============================] - 0s 11ms/step - loss: 0.1608 - accuracy: 0.9750 - val_loss: 0.1628 - val_accuracy: 0.9700\n",
            "Epoch 6/20\n",
            "13/13 [==============================] - 0s 11ms/step - loss: 0.1137 - accuracy: 0.9825 - val_loss: 0.1319 - val_accuracy: 0.9800\n",
            "Epoch 7/20\n",
            "13/13 [==============================] - 0s 11ms/step - loss: 0.0835 - accuracy: 0.9875 - val_loss: 0.1120 - val_accuracy: 0.9800\n",
            "Epoch 8/20\n",
            "13/13 [==============================] - 0s 12ms/step - loss: 0.0662 - accuracy: 0.9925 - val_loss: 0.0962 - val_accuracy: 0.9900\n",
            "Epoch 9/20\n",
            "13/13 [==============================] - 0s 10ms/step - loss: 0.0530 - accuracy: 0.9975 - val_loss: 0.0885 - val_accuracy: 0.9900\n",
            "Epoch 10/20\n",
            "13/13 [==============================] - 0s 12ms/step - loss: 0.0425 - accuracy: 0.9975 - val_loss: 0.0777 - val_accuracy: 0.9900\n",
            "Epoch 11/20\n",
            "13/13 [==============================] - 0s 11ms/step - loss: 0.0330 - accuracy: 0.9975 - val_loss: 0.0751 - val_accuracy: 0.9900\n",
            "Epoch 12/20\n",
            "13/13 [==============================] - 0s 11ms/step - loss: 0.0273 - accuracy: 1.0000 - val_loss: 0.0683 - val_accuracy: 0.9900\n",
            "Epoch 13/20\n",
            "13/13 [==============================] - 0s 11ms/step - loss: 0.0230 - accuracy: 1.0000 - val_loss: 0.0645 - val_accuracy: 0.9900\n",
            "Epoch 14/20\n",
            "13/13 [==============================] - 0s 9ms/step - loss: 0.0195 - accuracy: 1.0000 - val_loss: 0.0629 - val_accuracy: 0.9900\n",
            "Epoch 15/20\n",
            "13/13 [==============================] - 0s 10ms/step - loss: 0.0173 - accuracy: 1.0000 - val_loss: 0.0603 - val_accuracy: 0.9900\n"
          ]
        }
      ],
      "source": [
        "NUM_EPOCHS = 20\n",
        "BATCH_SIZE = 32\n",
        "\n",
        "# Split the x and y components of the train and validation subsets.\n",
        "y_train = df_train['Encoded Label']\n",
        "x_train = np.stack(df_train['Embeddings'])\n",
        "y_val = df_test['Encoded Label']\n",
        "x_val = np.stack(df_test['Embeddings'])\n",
        "\n",
        "# Train the model for the desired number of epochs.\n",
        "callback = keras.callbacks.EarlyStopping(monitor='accuracy', patience=3)\n",
        "\n",
        "history = classifier.fit(x=x_train,\n",
        "                         y=y_train,\n",
        "                         validation_data=(x_val, y_val),\n",
        "                         callbacks=[callback],\n",
        "                         batch_size=BATCH_SIZE,\n",
        "                         epochs=NUM_EPOCHS,)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "xGBaDHZUPdJO"
      },
      "source": [
        "## Evaluate model performance\n",
        "\n",
        "Use Keras <a href=\"https://www.tensorflow.org/api_docs/python/tf/keras/Model#evaluate\"><code>Model.evaluate</code></a> to get the loss and accuracy on the test dataset."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "d2kOeiqqQIB8"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "4/4 [==============================] - 0s 4ms/step - loss: 0.0603 - accuracy: 0.9900\n"
          ]
        },
        {
          "data": {
            "text/plain": [
              "{'loss': 0.060331668704748154, 'accuracy': 0.9900000095367432}"
            ]
          },
          "execution_count": 20,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "classifier.evaluate(x=x_val, y=y_val, return_dict=True)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "UyxMhiLYQXAN"
      },
      "source": [
        "One way to evaluate your model performance is to visualize the classifier performance. Use `plot_history` to see the loss and accuracy trends over the epochs."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "MaDO9hwbEOW3"
      },
      "outputs": [
        {
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAABlUAAAK9CAYAAAC9yOrfAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAADksUlEQVR4nOzdeXiU5fn28XNmsu8JWYFshCWyyBIQUUBsUQTFtWrRimLVt1asSq0VRUGs8nOjuNNWEW2xohZXKIpUQARBEsEF2bOwZCX7nszM+8ckA5HFEJ5kMpnv5zhyZPLMM/dzjdppJufc12Wy2+12AQAAAAAAAAAA4KTMri4AAAAAAAAAAADAHRCqAAAAAAAAAAAAtAKhCgAAAAAAAAAAQCsQqgAAAAAAAAAAALQCoQoAAAAAAAAAAEArEKoAAAAAAAAAAAC0AqEKAAAAAAAAAABAKxCqAAAAAAAAAAAAtAKhCgAAAAAAAAAAQCsQqgAAAAAAAAAAALQCoQoAoNUWL14sk8mkLVu2uLoUAAAAADDUSy+9JJPJpJEjR7q6FABAJ0aoAgAAAAAAAI+3ZMkSJSUlafPmzdqzZ4+rywEAdFKEKgAAAAAAAPBomZmZ2rBhg+bPn6+oqCgtWbLE1SUdV1VVlatLAACPR6gCADDUN998o4kTJyokJERBQUH65S9/qa+++qrFOQ0NDXrkkUfUp08f+fn5qVu3bho9erRWrVrlPCcvL0/Tpk1Tz5495evrq7i4OF122WXKysrq4GcEAAAAoKtbsmSJwsPDdfHFF+tXv/rVcUOV0tJS3XPPPUpKSpKvr6969uypqVOnqqioyHlObW2t5syZo759+8rPz09xcXG68sortXfvXknSmjVrZDKZtGbNmhZrZ2VlyWQyafHixc5jN910k4KCgrR3715NmjRJwcHBuv766yVJX3zxha6++molJCTI19dX8fHxuueee1RTU3NM3Tt27NA111yjqKgo+fv7q1+/fnrwwQclSZ9//rlMJpPee++9Yx735ptvymQyaePGjaf8zxMAujIvVxcAAOg6fvjhB40ZM0YhISG677775O3trb/97W8aN26c1q5d6+xNPGfOHM2bN0+33HKLzjrrLJWXl2vLli3KyMjQBRdcIEm66qqr9MMPP+jOO+9UUlKSCgoKtGrVKuXk5CgpKcmFzxIAAABAV7NkyRJdeeWV8vHx0ZQpU/Tyyy/r66+/1ogRIyRJlZWVGjNmjH788UfdfPPNGjZsmIqKivThhx/qwIEDioyMlNVq1SWXXKLVq1fr17/+te666y5VVFRo1apV+v7775WSknLKdTU2NmrChAkaPXq0nn76aQUEBEiS3nnnHVVXV+v2229Xt27dtHnzZj3//PM6cOCA3nnnHefjv/32W40ZM0be3t667bbblJSUpL179+qjjz7SY489pnHjxik+Pl5LlizRFVdcccw/k5SUFI0aNeo0/skCQNdDqAIAMMysWbPU0NCg9evXq1evXpKkqVOnql+/frrvvvu0du1aSdLy5cs1adIk/f3vfz/uOqWlpdqwYYOeeuop3Xvvvc7jM2fObP8nAQAAAMCjpKena8eOHXr++eclSaNHj1bPnj21ZMkSZ6jy1FNP6fvvv9eyZctahA+zZs2S3W6XJL3xxhtavXq15s+fr3vuucd5zv333+8851TV1dXp6quv1rx581ocf+KJJ+Tv7+/8+bbbblPv3r31wAMPKCcnRwkJCZKkO++8U3a7XRkZGc5jkvR///d/kiSTyaTf/OY3mj9/vsrKyhQaGipJKiws1Keffurc0QIAOIL2XwAAQ1itVn366ae6/PLLnYGKJMXFxem6667T+vXrVV5eLkkKCwvTDz/8oN27dx93LX9/f/n4+GjNmjUqKSnpkPoBAAAAeKYlS5YoJiZG559/viRH0HDttdfqrbfektVqlST95z//0eDBg4/ZzdF8fvM5kZGRuvPOO094Tlvcfvvtxxw7OlCpqqpSUVGRzjnnHNntdn3zzTeSHMHIunXrdPPNN7cIVH5az9SpU1VXV6d3333XeWzp0qVqbGzUb37zmzbXDQBdFaEKAMAQhYWFqq6uVr9+/Y6574wzzpDNZtP+/fslSXPnzlVpaan69u2rQYMG6U9/+pO+/fZb5/m+vr564okn9N///lcxMTEaO3asnnzySeXl5XXY8wEAAADQ9VmtVr311ls6//zzlZmZqT179mjPnj0aOXKk8vPztXr1aknS3r17NXDgwJOutXfvXvXr109eXsY1hvHy8lLPnj2POZ6Tk6ObbrpJERERCgoKUlRUlM477zxJUllZmSRp3759kvSzdaempmrEiBEt5sgsWbJEZ599tnr37m3UUwGALoNQBQDQ4caOHau9e/dq0aJFGjhwoF555RUNGzZMr7zyivOcu+++W7t27dK8efPk5+enhx56SGeccYbzU1cAAAAAcLr+97//KTc3V2+99Zb69Onj/Lrmmmsk6bgD60/HiXasNO+I+SlfX1+ZzeZjzr3gggu0fPly/fnPf9b777+vVatWOYfc22y2U65r6tSpWrt2rQ4cOKC9e/fqq6++YpcKAJwAM1UAAIaIiopSQECAdu7cecx9O3bskNlsVnx8vPNYRESEpk2bpmnTpqmyslJjx47VnDlzdMsttzjPSUlJ0R//+Ef98Y9/1O7duzVkyBA988wz+te//tUhzwkAAABA17ZkyRJFR0frxRdfPOa+ZcuW6b333tPChQuVkpKi77///qRrpaSkaNOmTWpoaJC3t/dxzwkPD5fkmCN5tOzs7FbX/N1332nXrl16/fXXNXXqVOfxVatWtTivuS3zz9UtSb/+9a81Y8YM/fvf/1ZNTY28vb117bXXtromAPAk7FQBABjCYrHowgsv1AcffKCsrCzn8fz8fL355psaPXq0QkJCJEmHDx9u8digoCD17t1bdXV1kqTq6mrV1ta2OCclJUXBwcHOcwAAAADgdNTU1GjZsmW65JJL9Ktf/eqYr+nTp6uiokIffvihrrrqKm3btk3vvffeMes0D6G/6qqrVFRUpBdeeOGE5yQmJspisWjdunUt7n/ppZdaXbfFYmmxZvPtZ599tsV5UVFRGjt2rBYtWqScnJzj1tMsMjJSEydO1L/+9S8tWbJEF110kSIjI1tdEwB4EnaqAABO2aJFi7Ry5cpjjs+ZM0erVq3S6NGj9fvf/15eXl7629/+prq6Oj355JPO8/r3769x48YpLS1NERER2rJli959911Nnz5dkrRr1y798pe/1DXXXKP+/fvLy8tL7733nvLz8/XrX/+6w54nAAAAgK7rww8/VEVFhS699NLj3n/22WcrKipKS5Ys0Ztvvql3331XV199tW6++WalpaWpuLhYH374oRYuXKjBgwdr6tSpeuONNzRjxgxt3rxZY8aMUVVVlT777DP9/ve/12WXXabQ0FBdffXVev7552UymZSSkqKPP/5YBQUFra47NTVVKSkpuvfee3Xw4EGFhIToP//5j0pKSo4597nnntPo0aM1bNgw3XbbbUpOTlZWVpaWL1+urVu3tjh36tSp+tWvfiVJevTRR1v/DxIAPAyhCgDglL388svHPX7TTTfpiy++0MyZMzVv3jzZbDaNHDlS//rXvzRy5EjneX/4wx/04Ycf6tNPP1VdXZ0SExP1l7/8RX/6058kSfHx8ZoyZYpWr16tf/7zn/Ly8lJqaqrefvttXXXVVR3yHAEAAAB0bUuWLJGfn58uuOCC495vNpt18cUXa8mSJaqrq9MXX3yh2bNn67333tPrr7+u6Oho/fKXv3QOkrdYLFqxYoUee+wxvfnmm/rPf/6jbt26afTo0Ro0aJBz3eeff14NDQ1auHChfH19dc011+ipp5762YHyzby9vfXRRx/pD3/4g3MG5RVXXKHp06dr8ODBLc4dPHiwvvrqKz300EN6+eWXVVtbq8TEROfMmKNNnjxZ4eHhstlsJwyaAACSyf7T/X4AAAAAAAAAPEpjY6O6d++uyZMn69VXX3V1OQDQaTFTBQAAAAAAAPBw77//vgoLCzV16lRXlwIAnRo7VQAAAAAAAAAPtWnTJn377bd69NFHFRkZqYyMDFeXBACdGjtVAAAAAAAAAA/18ssv6/bbb1d0dLTeeOMNV5cDAJ0eO1UAAAAAAAAAAABagZ0qAAAAAAAAAAAArUCoAgAAAAAAAAAA0Aperi6go9lsNh06dEjBwcEymUyuLgcAAABod3a7XRUVFerevbvMZj5XhZ/H+yYAAAB4klN5z+RxocqhQ4cUHx/v6jIAAACADrd//3717NnT1WXADfC+CQAAAJ6oNe+ZPC5UCQ4OluT4hxMSEuLiagAAAID2V15ervj4eOfvwsDP4X0TAAAAPMmpvGfyuFCleet6SEgIbw4AAADgUWjjhNbifRMAAAA8UWveM9FQGQAAAAAAAAAAoBUIVQAAAAAAAAAAAFqBUAUAAAAAAAAAAKAVPG6mCgAAACS73a7GxkZZrVZXlwIDWCwWeXl5MTMFHcpqtaqhocHVZcAgvI4AAAC0DqEKAACAh6mvr1dubq6qq6tdXQoMFBAQoLi4OPn4+Li6FHiAyspKHThwQHa73dWlwEC8jgAAAPw8QhUAAAAPYrPZlJmZKYvFou7du8vHx4dPJbs5u92u+vp6FRYWKjMzU3369JHZTJdftB+r1aoDBw4oICBAUVFRvIZ0AbyOAAAAtB6hCgAAgAepr6+XzWZTfHy8AgICXF0ODOLv7y9vb29lZ2ervr5efn5+ri4JXVhDQ4PsdruioqLk7+/v6nJgEF5HAAAAWoePngAAAHggPoHc9fDvFB2NHSpdD68jAAAAP4/fmAAAAAAAAAAAAFqBUAUAAAAAAAAAAKAVCFUAAADgkZKSkrRgwQJXlwHAjfE6AgAA4HkIVQAAANCpmUymk37NmTOnTet+/fXXuu2224wtFkCnxOsIAAAAjOLl6gIAAACAk8nNzXXeXrp0qR5++GHt3LnTeSwoKMh52263y2q1ysvr53/NjYqKMrZQAJ0WryMAAAAwCjtVAAAAPJzdbld1fWOHf9nt9lbVFxsb6/wKDQ2VyWRy/rxjxw4FBwfrv//9r9LS0uTr66v169dr7969uuyyyxQTE6OgoCCNGDFCn332WYt1f9q2x2Qy6ZVXXtEVV1yhgIAA9enTRx9++KGR/6iBLslVryG8jgAAAMAV2KkCAADg4WoarOr/8Ccdft3tcycowMeYX0fvv/9+Pf300+rVq5fCw8O1f/9+TZo0SY899ph8fX31xhtvaPLkydq5c6cSEhJOuM4jjzyiJ598Uk899ZSef/55XX/99crOzlZERIQhdQJdkateQyReRwAAANDx2KkCAAAAtzd37lxdcMEFSklJUUREhAYPHqz/9//+nwYOHKg+ffro0UcfVUpKys9+Yvymm27SlClT1Lt3bz3++OOqrKzU5s2bO+hZAHAlXkcAAADQGuxUAQAA8HD+3hZtnzvBJdc1yvDhw1v8XFlZqTlz5mj58uXKzc1VY2OjampqlJOTc9J1zjzzTOftwMBAhYSEqKCgwLA6ga7IVa8hzdc2Cq8jAAAAaA1CFQAAAA9nMpkMa5/jKoGBgS1+vvfee7Vq1So9/fTT6t27t/z9/fWrX/1K9fX1J13H29u7xc8mk0k2m83weoGupCu8hki8jgAAAKB13P83XwAAAOAnvvzyS91000264oorJDk+cZ6VleXaogC4FV5HAAAAcDzMVAEAAECX06dPHy1btkxbt27Vtm3bdN111/FJcQCnhNcRAAAAHA+hCgAAALqc+fPnKzw8XOecc44mT56sCRMmaNiwYa4uC4Ab4XUEAAAAx2Oy2+12VxfRkcrLyxUaGqqysjKFhIS4uhwAAIAOVVtbq8zMTCUnJ8vPz8/V5cBAJ/t3y+/Ande6dev01FNPKT09Xbm5uXrvvfd0+eWXn/Qxa9as0YwZM/TDDz8oPj5es2bN0k033dTinBdffFFPPfWU8vLyNHjwYD3//PM666yzWl3Xyf6b4XWk6+LfLQAA8FSn8p6JnSoAAAAA4CJVVVUaPHiwXnzxxVadn5mZqYsvvljnn3++tm7dqrvvvlu33HKLPvnkE+c5S5cu1YwZMzR79mxlZGRo8ODBmjBhggoKCtrraQAAAAAeg0H1HWx3foW2ZJdowoBYRQT6uLocAAAAAC40ceJETZw4sdXnL1y4UMnJyXrmmWckSWeccYbWr1+vv/71r5owYYIkR9uqW2+9VdOmTXM+Zvny5Vq0aJHuv/9+458EAADAT9jtdlXVW1VSVa/iqnoVV9errsHq6rLgBoYlhCs6pHPvmCVU6WB3/vsb7cirUHiAjy4aGOvqcgAAAAC4kY0bN2r8+PEtjk2YMEF33323JKm+vl7p6emaOXOm836z2azx48dr48aNJ1y3rq5OdXV1zp/Ly8uNLRwAALi1mnqriqvrnSFJSXXT96bApKSqwXm8pOnneqvN1WXDDS26abh+QaiCow1LDNeOvApl5JQQqgAAAAA4JXl5eYqJiWlxLCYmRuXl5aqpqVFJSYmsVutxz9mxY8cJ1503b54eeeSRdqkZAAB0LnWNVpVWN/wkFKlXcVXDkbDkJ6FJbUPbAhJfL7O6BfooPNBH/t4Wg58JuqJQf29Xl/CzCFU6WFpCuN7clKP07BJXlwIAAAAAkqSZM2dqxowZzp/Ly8sVHx/vwooAAEBrNFhtKq1uOM7OkROHJFX1bWvD5W0xKTzARxGBPke+B3orIsARmrQ87qOIAB/5+xCkoOshVOlgw5PCJUnfHShTbYNVfiS0AAAAAFopNjZW+fn5LY7l5+crJCRE/v7+slgsslgsxz0nNvbEO+V9fX3l6+vbLjUDALoWu92ugoo67S2o1N7CSu0trNK+oirVMi+jw9Q32lTaFJKU1za2aQ2L2aTwAG+FBxwJQBzBiHeL4OTIfd4K8vWSyWQy+NkA7odQpYMlRAQoMshHRZX1+uFQmdISI1xdEgAAAAA3MWrUKK1YsaLFsVWrVmnUqFGSJB8fH6WlpWn16tW6/PLLJUk2m02rV6/W9OnTO7pcAIAbq2u0KvtwdcvwpOl7ZV3b/pCP9mEyOVomNQcjjlDEu2VYctRukogAHwX7eclsJiAB2oJQpYOZTCYNSwjXp9vzlZ5dQqgCAAAAeLDKykrt2bPH+XNmZqa2bt2qiIgIJSQkaObMmTp48KDeeOMNSdLvfvc7vfDCC7rvvvt0880363//+5/efvttLV++3LnGjBkzdOONN2r48OE666yztGDBAlVVVWnatGkd/vwAAJ1fSVV9U2jiCEyaQ5Sc4mrZ7Md/jMVsUkJEgFKiApUSFaReUYEK8u38cxC6Ci+LqUWrrVB/b1kISIAOQ6jiAmmJR0IVAAAAAJ5ry5YtOv/8850/N881ufHGG7V48WLl5uYqJyfHeX9ycrKWL1+ue+65R88++6x69uypV155RRMmTHCec+2116qwsFAPP/yw8vLyNGTIEK1cufKY4fUAAM/RaLXpQEnNkfCkoEp7Cyu1r6hKxVX1J3xcsK+XekUHOcOTlKgg9Y4OVEJEoHy8zB34DACg8yBUcYG0RMdclfTsUtntdnoRAgAAdIBx48ZpyJAhWrBggSQpKSlJd999t+6+++4TPsZkMum9995ztlFqK6PWQdczbtw42e0n+BiwpMWLFx/3Md98881J150+fTrtvgzGawgAd1BZ19jUoutIcLK3sFJZRdWqt9pO+LgeYf7q1RycNIUovaOCFBXsy9+tAOAnCFVcYGCPUHlbTCqqrNP+4holdAtwdUkAAACd2uTJk9XQ0KCVK1cec98XX3yhsWPHatu2bTrzzDNbvebXX3+twMBAI8vUnDlz9P7772vr1q0tjufm5io8PNzQawFoPV5DAHQldrtduWW1TcFJU8uupvAkv7zuhI/z9TKrV9RRu06awpPkyEAF+PAnQgBoLV4xXcDP26KBPUL1TU6p0nOKCVUAAAB+xm9/+1tdddVVOnDggHr27Nnivtdee03Dhw8/pT+GSlJUVJSRJZ5UbGxsh10LwLF4DQHgjmobrMosamrTdVRwsq+wStX11hM+LirYVylRgU0BypEQpUeYP4PJAcAALm1+uG7dOk2ePFndu3eXyWTS+++/f9Lzly1bpgsuuEBRUVEKCQnRqFGj9Mknn3RMsQYb3tQCbEsWc1UAAICL2e1SfVXHf52k5dFPXXLJJYqKijqmFVJlZaXeeecdXX755ZoyZYp69OihgIAADRo0SP/+979PumZSUpKzjY8k7d69W2PHjpWfn5/69++vVatWHfOYP//5z+rbt68CAgLUq1cvPfTQQ2poaJDkaNP0yCOPaNu2bTKZTDKZTM56f/q77nfffadf/OIX8vf3V7du3XTbbbepsrLSef9NN92kyy+/XE8//bTi4uLUrVs33XHHHc5rAZ2Kq15DTuF1hNcQXkOAzsput6uosk6b9h3Wm5ty9OjH23XTa5s15sn/6YyHV2ris19o+pvfaP6qXfpg6yF9f7Bc1fVWeZlNSokK1IX9Y3T7uBQ9ffVgvff7c7Rt9oX6+sHxeuu2UXr8ikH67ehkjesXrfiIAAIVADCIS3eqVFVVafDgwbr55pt15ZVX/uz569at0wUXXKDHH39cYWFheu211zR58mRt2rRJQ4cO7YCKjZOWGK5/fJHJsHoAAOB6DdXS4907/roPHJJ8Wtc6x8vLS1OnTtXixYv14IMPOnt7v/POO7JarfrNb36jd955R3/+858VEhKi5cuX64YbblBKSorOOuusn13fZrPpyiuvVExMjDZt2qSysrLjzkkIDg7W4sWL1b17d3333Xe69dZbFRwcrPvuu0/XXnutvv/+e61cuVKfffaZJCk0NPSYNaqqqjRhwgSNGjVKX3/9tQoKCnTLLbdo+vTpLf7g+/nnnysuLk6ff/659uzZo2uvvVZDhgzRrbfe2qp/ZkCHcdVriNTq1xFeQ3gNAVytwWpTTnG1s12Xc+5JYZXKak4ceIb4eal3tGPHibN1V3SQEiIC5G1hUDwAuIJLQ5WJEydq4sSJrT7/6E8BSdLjjz+uDz74QB999JHbhSrDEhw7VXbmV6iitkHBft4urggAAKBzu/nmm/XUU09p7dq1GjdunCRH256rrrpKiYmJuvfee53n3nnnnfrkk0/09ttvt+oPop999pl27NihTz75RN27O/44/Pjjjx/zu+qsWbOct5OSknTvvffqrbfe0n333Sd/f38FBQXJy8vrpK163nzzTdXW1uqNN95wzmN44YUXNHnyZD3xxBOKiYmRJIWHh+uFF16QxWJRamqqLr74Yq1evZo/iAJtxGsIryFARyiraWgKTKqOmnlSqezD1Wq0HX93nckk9Qz3b2rVFaReTUPiU6KD1C3Qh0HxANDJuPVMFZvNpoqKCkVERJzwnLq6OtXVHRnSVV5e3hGl/azoED/FR/hrf3GNtu4v1Zg+HdePFwAAoAXvAMenvV1x3VOQmpqqc845R4sWLdK4ceO0Z88effHFF5o7d66sVqsef/xxvf322zp48KDq6+tVV1engIDWXePHH39UfHy884+hkjRq1Khjzlu6dKmee+457d27V5WVlWpsbFRISMgpPY8ff/xRgwcPbjHg+txzz5XNZtPOnTudfxAdMGCALBaL85y4uDh99913p3QtoEO46jWk+dqtxGsIryGAUWw2uw6W1jh3mjSHJ/uKqlRYceJB8f7eFqVEO+ab9IoMct5OjgyUn3fT/15tVscOQElSvVRf3/5PCAA6Ey9/ydK5Y4vOXd3PePrpp1VZWalrrrnmhOfMmzdPjzzySAdW1XppCeHaX1yj9OwSQhUAAOA6JlOr23C52m9/+1vdeeedevHFF/Xaa68pJSVF5513np544gk9++yzWrBggQYNGqTAwEDdfffdqjfwDxEbN27U9ddfr0ceeUQTJkxQaGio3nrrLT3zzDOGXeNo3t4tdzKbTCbZbLZ2uRZwWngNaRVeQwD3U1Nv1b6ipuCk4Ei7rsyiStU2nPh/TzEhvs5dJ83tulKighQb4nf8uSZ1ldL21dKOFdKulVJtafs9KQDo7K57W+o7wdVVnJTbhipvvvmmHnnkEX3wwQeKjo4+4XkzZ87UjBkznD+Xl5crPj6+I0r8WWmJ4Xp/6yHmqgAAALTSNddco7vuuktvvvmm3njjDd1+++0ymUz68ssvddlll+k3v/mNJMeO5l27dql///6tWveMM87Q/v37lZubq7i4OEnSV1991eKcDRs2KDExUQ8++KDzWHZ2dotzfHx8ZLVaf/ZaixcvVlVVlfOT5l9++aXMZrP69evXqnoBtA2vIQB+ym63q7CiTnsKW4Yn+wqrdLC05oSP87GYlRQZcCQ8iQ5Ur0hH665WtXivLJR2/VfasVza+7lkPfEOFwBA5+KWocpbb72lW265Re+8847Gjx9/0nN9fX3l6+vbQZWdmmGJjrkqW3NKZbXZZTnepxUAAADgFBQUpGuvvVYzZ85UeXm5brrpJklSnz599O6772rDhg0KDw/X/PnzlZ+f3+o/iI4fP159+/bVjTfeqKeeekrl5eUt/vDZfI2cnBy99dZbGjFihJYvX6733nuvxTlJSUnKzMzU1q1b1bNnTwUHBx/zu+j111+v2bNn68Ybb9ScOXNUWFioO++8UzfccIOzbQ+A9sFrCOC56httyj5cdaRdV1OIsq+gUhV1jSd8XHiAd4vgpPl2z3B/eZ3qoPjDex0hys4VUs5Xko6asRKeJKVeIqVeLMUNkUwMoQfgoSydf/a424Uq//73v3XzzTfrrbfe0sUXX+zqck5LamyIAn0sqqhr1K78Cp0Rd2q9dAEAADzRb3/7W7366quaNGmSc37BrFmztG/fPk2YMEEBAQG67bbbdPnll6usrKxVa5rNZr333nv67W9/q7POOktJSUl67rnndNFFFznPufTSS3XPPfdo+vTpqqur08UXX6yHHnpIc+bMcZ5z1VVXadmyZTr//PNVWlqq1157zflH22YBAQH65JNPdNddd2nEiBEKCAjQVVddpfnz55/2PxsAP4/XEKBrK62ub5px0jI8ySmulvUEg+LNJikhomnXSXRTy66oIPWKClJEoE/bi7HbpUPfOIKUHculwh9b3h835EiQEn2Go50iAKDTM9nt9uP/P0oHqKys1J49eyRJQ4cO1fz583X++ecrIiJCCQkJmjlzpg4ePKg33nhDkqPl14033qhnn31WV155pXMdf39/hYaGtuqa5eXlCg0NVVlZ2SkPBGwPv3llk9bvKdJfLh+o35yd6OpyAABAF1dbW6vMzEwlJyfLz8/P1eXAQCf7d9vZfgdG53ey/2Z4Hem6+HcLd2G12XWgpFr7jt510hSiHK468SykIF8v9YoKPDLrpClESewWIF8vizHFNdZL2eubgpQVUsWhI/eZvaSk0Y4gpd9EKbSnMdcEAJy2U3nP5NKdKlu2bNH555/v/Ll59smNN96oxYsXKzc3Vzk5Oc77//73v6uxsVF33HGH7rjjDufx5vPd0bDEcK3fU6SM7BJCFQAAAAAAgCZVdY0tg5Om8CTzcJXqG088KL57qJ9SooPUKzJQvaODnOFJdLCvTO2xG6SuQtrzmSNI2fWpVHfULjefIKn3eMdulD4XSP7hxl8fANChXBqqjBs3TifbKPPToGTNmjXtW5ALpDXNVUnPYVg9AAAAAADwLHa7XXnltUfCk4JK59yT3LLaEz7Ox8usXpGBjnZdzd+jgpQcGahA3w74c1dFvmM2ys4V0r41kvWoHTKBUVK/SY4dKcljJW92fgFAV+J2M1W6miHxYTKZpOzD1SqsqFNUsO/PPwgAAAAAAMCN1DZYlX24+qjgpGlQfGGlquqtJ3xcZJCPejUPio9yhCe9o4LUPcxfFnMHzyAp2iPt+NixI+XA12oxaD4iRTrjEqnfxVLP4ZLZoHZiAIBOh1DFxUL9vdU3Olg78yuUkVOiCQNiXV0SAAAAAABAmxRX1R8TnOwtrNT+4mqdYE68LGaTErsFNA2Hb5554ghRwgJOY1D86bLZpEMZTUHKCqloZ8v7e6Q52nqlXiJF9mXQPAB4CEKVTmBYYrgjVMkmVAEAAB3jZC1Y4Z74d4qOxn9zXQ//TtFajVab9pfUHBWcHAlPSqsbTvi4YD+vI4FJ9JHwJCEiQD5e5g58BifRWC9lrTsyaL4y78h9Zm9HO6/Uix3tvULiXFcnAMBlCFU6geGJ4fr35hxtyWauCgAAaF/e3t6SpOrqavn7+7u4Ghipurpa0pF/x0B7sVgcLW3q6+t5HelieB3BT9ntdmUWVWnbgVLtKXAMid9bWKmsw1VqsJ44hOsZ7t/UsiuwRYgSFdROg+JPV22ZtHuVI0jZvUqqrzhyn0+wY8B886B5v1DX1QkA6BQIVTqB5mH13x0oU12jVb5e9N0EAADtw2KxKCwsTAUFBZKkgICAzvnHDbSa3W5XdXW1CgoKFBYW5vyDN9BevLy8FBAQoMLCQnl7e8ts7iSfLkeb8TqCZg1Wm344VK4tWcX6OqtYW7JKdLiq/rjn+nmb1SsyqGlA/JHwJDkyUP4+bvDfUHmuY8j8juVS5jrJdtQOm6BYKXWSYz5K8hjJi/m3AIAjCFU6gcRuAeoW6KPDVfX6/mC5M2QBAABoD7GxjnajzcEKuoawsDDnv1ugPZlMJsXFxSkzM1PZ2dmuLgcG4nXE81TUNigjp1TpWcX6OqtE3+wvUW2DrcU5Pl5mndkjVP1ig5t2nDhClO6h/jJ39KD402G3S0W7jgyaP5je8v7Ivkfmo3QfJhEYAwBOgFClEzCZTBqWGK5V2/OVkV1CqAIAANpV8x9Eo6Oj1dBw4r7ncB/e3t58shwdysfHR3369FF9/fE/wQ73w+uIZ8grq23ageIIUXbklR8zPD4swFvDE8M1PClCI5LCNbBHqPt21LDZpANfSzuXO4KUw3ta3t/zrKYg5WIpso9ragQAuB1ClU4irSlUSc8u0a2uLgYAAHgEi8XCH9AAtJnZbJafn5+rywBwAjabXbsLKp0hypbsEh0oqTnmvISIgBYhSkpUkGMHis0mHfpGWvOxlL2hZXssd1G6X6o6ameuxUdKPq9p0PxEKZidWQCAU0eo0kk0705JzymR3W6ntzkAAAAAAGi12garvjtY5pyFsiWrWOW1jS3OMZuk/t1DNDwxQiOSIjQ8KVwxIUeFo4310r7Vjl0dO/8rVeR28LNoB76hUt8LHUFK7/GSb7CrKwIAuDlClU5iUI9QeVtMKqyo04GSGsVHBLi6JAAAAAAA0EmVVNUrPbtEX2cXKz2rRN8eKFO9teU8FH9vi4Ylhikt0bELZWhCuIJ8f/KnoNpyac8qR5Cye5VUV37kPp8gRxDRd4Lk74atyn1DpJ4jJC8fV1cCAOhCCFU6CT9viwb2CNU3OaXakl1MqAIAAAAAACRJdrtd+4trtCXbMQtlS1axdhdUHnNeZJCvRiQdaeV1RlyIvC3HGbhenivtXOEIUjLXtWztFRgtpU5yDGxPHit5+bbjMwMAwP0QqnQiaQnh+ianVOnZJbpiaE9XlwMAAAAAAFyg0WrTjrwKZyuvr7OKVVBRd8x5KVGBGp7oaOM1IilCid0CTtxOvHCXtONjR5BycEvL+7r1doQoqRdLPYZL5uMEMQAAQBKhSqeSlhiuV9ZnKj271NWlAAAAAACADlJV16it+0sds1Cyi5WRXaKqemuLc7wtJg3sEeqYhZIYrrTEcHULOskuEpvNEZ40BymH97S8v8dwR4iSeokU1bcdnhUAAF0ToUonMqxpWP3OvHJV1DYo2M/bxRUBAAAAAACjFVTUKj2rxNHKK7tYPxwql9Vmb3FOsK+X0pLCNTzR0c5rcM8w+ftYTr5wY52jndeOjx2D5ivzj9xn9pZ6necIUvpOlELi2uGZAQDQ9RGqdCIxIX7qGe6vAyU12ra/TKP7RLq6JAAAAAAAcBrsdrv2FlZpS1axtmQ75qFkHa4+5ry4UD+NaJqFMjwpQn1jgmUxn6CV19FqSh0D5nd8LO35TKo/ataKb4jU5wJHkNL7AskvxLgnBgCAhyJU6WTSEsN1oKRG6dklhCoAAAAAALiZ+kabvj9Upi1ZjqHy6dklKq6qb3GOyST1iwl2tPJqClF6hPm3/iJlB48Mms/6QrI1HrkvOE7qN8kRpCSNkbx8DHpmAABAIlTpdNISw/XB1kNKzylxdSkAAAAAAOBnlNU0KCPHsQNlS1aJtu4vVV2jrcU5vl5mDY4P0/DEcI1IjtCwhHCF+p9Cy2+7XSrccWQ+yqFvWt4fldoUpFwidR/KoHkAANoRoUonk9Y0V+Wb7BJZbfbWbfUFAAAAAAAd4lBpjb5uClC+zirWzvwK2VuOQ1F4gLeGN7XySkuM0MAeIfL1+pl5KD9ls0oHvj4SpBTvO+pOkxR/lmM3Sr+Lpcjep/28AABA6xCqdDL9YoIV6GNRRV2jdhdUKDWWfqcAAAAAALiCzWbXroIKx0D5piDlYGnNMecldgvQ8MQj81BSogJlMrXhQ5INtdK+NY4gZddKqarwyH0WH6nX+VLqJMeg+eCYtj8xAADQZoQqnYyXxawhCWH6cs9hpWeXEKoAAAAAANBBahus2ra/VFuyHbtQ0rNLVFHb2OIci9mkAd1DnCFKWlK4ooP92n7RmhJp16dNg+ZXSw1VR+7zDZX6TmgaNP9LyTe47dcBAACGIFTphNISwp2hyvUjE11dDgAAAAAAXVJxVb3Ss0uahsoX67uDZWqwtuzlFehj0dCEcA1PCteIpAgNiQ9ToO9p/jmldP9Rg+bXS3brkfuCuztClNSLpaTRkuUUZq8AAIB2R6jSCQ1rmquSkc2wegAAAAAAjGC325VTXO1s5fV1VrH2FlYdc150sK9GJEU4Q5TU2GB5WQwY/F5XKW3+m7T9Ayl3208u2v9IkBI3RGpL6zAAANAhCFU6oaEJjlAl63C1iirrFBnk6+KKAAAAAABwL41Wm37MrXAMlc8u1tdZJSqsqDvmvD7RQRqeFN7UzitC8RH+bZuHcjI7/ystv1cqP9B0wCQljHLMR+k3SeqWYuz1AABAuyFU6YRC/b3VNyZIu/IrlZFdogsHxLq6JAAAAAAAOrWqukZ9k1PqDFG+ySlVdb21xTneFpPO7Bnm2IWSGKG0xHCFB/q0X1FlB6WVf5Z+/Mjxc2iCNPZeR5ASFNV+1wUAAO2GUKWTSkuM0K78SqUTqgAAAAAAcIyC8lrnQPktWSXanlsuq63lPJQQPy8Nb2rlNTwxQmf2DJWft6X9i7NZpc3/kP73qFRfKZks0jnTpfP+LPkEtv/1AQBAuyFU6aTSEsP17805SmeuCgAAAADAw9ntdu0trNTXWY4QJT27RNmHq485r0eYv0YkhWt4kqOVV5/oIJnNHTyf5NBW6eO7pUPfOH7uOUK6ZIEUO7Bj6wAAAO2CUKWTSmsaVv/twTLVNVrl69UBn6QBAAAAAKATqGu06vuD5U0D5UuUnl2skuqGFueYTNIZsSHOEGV4UrjiQv1dVLGkugrp88elTQslu03yDZXGz5bSpklmAwbdAwCAToFQpZNK6hagiEAfFVfV64dD5RrWNLweAAAAAICupqymQRlHtfLaeqBU9Y22Fuf4eZs1JD5MI5IiNDwpQkMTwhTi5+2iin9ix3JpxZ+k8oOOnwdcKV00TwqmnTcAAF0NoUonZTKZNCwhXJ/9mK+M7BJCFQAAAABAl2C323WwtEZbskq0JdsRouzMr5C95TgUdQv0cQyUbwpRBnQPkbelk+34KDsgrbhP2rnc8XNYonTxfKnPeNfWBQAA2g2hSieWlugIVdKzS3TLGFdXAwAAAADAqbPa7NqZV6Et2Y5WXluyipVbVnvMecmRgRqe2ByihCs5MlAmUwfPQ2kta6O0+e/S//4iNVRJZi/pnD9IY/8k+QS4ujoAANCOCFU6sea5KluyS2S32zvvL5MAAAAAADSpqbdq6/5Sbckq1pbsEmVkl6iirrHFOV5mkwb0CNWIRMc8lLTEcEUF+7qo4lN0MEP66C4p71vHz/EjHYPoY/q7tCwAANAxCFU6sTN7hsrbYlJhRZ0OlNQoPoJPuwAAAAAAOpfDlXXakl3iHCr//cEyNdpa9vIK8vXS0IQw5y6UIfFhCvBxsz9J1JZLnz/m2KFit0l+odIFc6WhUxlEDwCAB3Gz32A8i5+3RQO6h2rr/lKlZ5cQqgAAAAAAXMputyvrcHXTQHnHPJR9RVXHnBcT4qsRSRHOECU1NkQWs5t2X7DbpR8/kv57n1SR6zg26GppwuNSULRrawMAAB2OUKWTS0sMd4Yqlw/t4epyAAAAAAAepMFq0/ZD5U0himOwfFFl/THn9Y0J0vCkCI1ICtfwxAj1DPfvGi2sS3OkFX+Sdq10/ByeLF0yX0r5hWvrAgAALkOo0smlJYbr1fWZSs8ucXUpAAAAAIAurqK2Qd/klDpbeW3dX6qaBmuLc3wsZg2OD3WGKMMSwhUW4OOiituJtVHa9LL0+eNSQ7Vk9pbOvUsae6/k7e/q6gAAgAsRqnRyzcPqd+SVq7KuUUG+/CsDAAAAABijtsGqz37M15asEn2dVawfc8v1k3EoCvX31vCmgfIjksI1sEeo/Lwtrim4IxxIlz6+S8r7zvFzwijHIProVJeWBQAAOgf+Qt/JxYT4qUeYvw6W1mjb/lKd2zvS1SUBAAAAALoAm82uqa9u1uas4hbH4yP8NSIxwhmipEQFyeyu81BORW2ZtPpR6etXJNklvzDpwkelIb9hED0AAHAiVHEDaYnhOlhao/TsEkIVAAAAAIAh3vp6vzZnFSvQx6Krh8dreNM8lNhQP1eX1rHsdmn7+9J/75cq8xzHzvy1dOFfpKAol5YGAAA6H0IVNzA8KVwfbjukLcxVAQAAAAAY4HBlnZ5YuUOS9McL++nm0ckurshFSrKlFfdKuz91/BzRS7rkr1KvcS4tCwAAdF6EKm5gWIJjrso32SWy2eyese0aAAAAANBu5v13h8pqGtQ/LkRTRyW6upyOZ22QvnpJ+nye1FjjGEQ/ZoY0eobk7WE7dQAAwCkhVHEDqbHBCvCxqKKuUbsLKtUvNtjVJQEAAAAA3NTmzGK9m35AkvSXKwbKy+Jh80L2b5Y+ulsq+MHxc+K5jkH0UX1dWRUAAHATHvabk3vyspg1JD5MkpROCzAAAAAAQBs1WG166P3vJUlTzop3dkbwCDWl0sczpFcvdAQq/hHSZS9JNy0nUAEAAK1GqOIm0hIdv+gSqgAAAAAA2uq1LzO1M79CEYE+um9CqqvL6Rh2u/T9f6QXz5K2vCrJLg25Xpq+RRp6vWSixTYAAGg92n+5iWFNoUpGDqEKAAAAAODUHSqt0YLPdkuS7p+YqvBAHxdX1AGKM6Xlf5T2rnb83K23YxB98ljX1gUAANwWoYqbGBbvCFUyi6p0uLJO3YJ8XVwRAAAAAMCdzP1ou6rrrRqeGK5fDevp6nLal7VB2vC8tPYJqbFWsvhIY/4ojb5H8uL9NAAAaDtCFTcRGuCtvjFB2pVfqfTsEl04INbVJQEAAAAA3MTnOwq08oc8Wcwm/eWKgTKbu3DLq5xN0sd3SwXbHT8njXHsTons49KyAABA18BMFTfinKtCCzAAAAAAQCvVNlg1+8MfJEk3n5uk1NgQF1fUTmpKpI/ukhZd6AhUArpJly+UbvyIQAUAABiGUMWNDEtomqvCsHoAAACgy3jxxReVlJQkPz8/jRw5Ups3bz7huQ0NDZo7d65SUlLk5+enwYMHa+XKlS3OmTNnjkwmU4uv1FQPGUiO43rp8z3KKa5WbIif7hrf19XlGM9ul759R3phhJS+2HFs6G8cg+iHTGEQPQAAMBTtv9xI806VbQfKVN9ok48XmRgAAADgzpYuXaoZM2Zo4cKFGjlypBYsWKAJEyZo586dio6OPub8WbNm6V//+pf+8Y9/KDU1VZ988omuuOIKbdiwQUOHDnWeN2DAAH322WfOn728eOvnqfYVVmrh2n2SpNmT+yvIt4v9t1C8T/p4hrTvc8fPkX2lSxZISee6tCwAANB18Vd5N5IcGajwAG/VN9r0w6EyV5cDAAAA4DTNnz9ft956q6ZNm6b+/ftr4cKFCggI0KJFi457/j//+U898MADmjRpknr16qXbb79dkyZN0jPPPNPiPC8vL8XGxjq/IiMjO+LpoJOx2+16+IMfVG+16by+UbpoYBeazdlYL617WnpplCNQsfhK58+SfreeQAUAALSrLvYRla7NZDIpLTFcn/1YoPTsEg1tagcGAAAAwP3U19crPT1dM2fOdB4zm80aP368Nm7ceNzH1NXVyc/Pr8Uxf39/rV+/vsWx3bt3q3v37vLz89OoUaM0b948JSQknLCWuro61dXVOX8uLy9vy1NCJ/Pxt7lav6dIPl5mzb1sgEzNbbDsdsfMkR0rpB0fS/k/SLK7tNZTZrc5viSp1zjp4vlStxSXlgQAADwDoYqbGdYUqmQwrB4AAABwa0VFRbJarYqJiWlxPCYmRjt27DjuYyZMmKD58+dr7NixSklJ0erVq7Vs2TJZrVbnOSNHjtTixYvVr18/5ebm6pFHHtGYMWP0/fffKzg4+Ljrzps3T4888ohxTw4uV1HboEc/3i5JumNcbyWG+0nZG6Qdyx1BSkmWaws0QmCUNOFxadDVzE0BAAAdhlDFzQxPjJAkbckqkd1uP/JJIwAAAABd3rPPPqtbb71VqampMplMSklJ0bRp01q0C5s4caLz9plnnqmRI0cqMTFRb7/9tn77298ed92ZM2dqxowZzp/Ly8sVHx/ffk8E7W7+ql0qq6jQdaG7dEfFcunplVL14SMnWHyllF9IqZOk5LGOn91NYKRk8XZ1FQAAwMMQqriZM3uGystsUkFFnQ6U1Cg+IsDVJQEAAABog8jISFksFuXn57c4np+fr9jY48++iIqK0vvvv6/a2lodPnxY3bt31/33369evXqd8DphYWHq27ev9uzZc8JzfH195evrhn9Ux7Gqi3Vg83s6e/O/9SffbxVQVydta7rPL0zqe5GUerEjUPENcmWlAAAAbolQxc34eVs0oEeotu0vVUZOCaEKAAAA4KZ8fHyUlpam1atX6/LLL5ck2Ww2rV69WtOnTz/pY/38/NSjRw81NDToP//5j6655poTnltZWam9e/fqhhtuMLJ8dCYl2dLOFdKO5bJnb1BPu1U9LU33hcY7QpTUi6WEUezsAAAAOE2EKm4oLSFc2/aXKj27RJcN6eHqcgAAAAC00YwZM3TjjTdq+PDhOuuss7RgwQJVVVVp2rRpkqSpU6eqR48emjdvniRp06ZNOnjwoIYMGaKDBw9qzpw5stlsuu+++5xr3nvvvZo8ebISExN16NAhzZ49WxaLRVOmTHHJc0Q7sNul/O+PzEfJ+855l0nSj7YEfW4aoWt+c7siew9n3ggAAICBCFXcUFpiuBZ9man0bIbVAwAAAO7s2muvVWFhoR5++GHl5eVpyJAhWrlypXN4fU5Ojsxms/P82tpazZo1S/v27VNQUJAmTZqkf/7znwoLC3Oec+DAAU2ZMkWHDx9WVFSURo8era+++kpRUVEd/fRgJGujlLOxKUhZLpXlHLnPZJYSzlFVrwm6+vNwba+P0EOX9Fdkn2TX1QsAANBFmex2u93VRXSk8vJyhYaGqqysTCEhIa4up03yymp19rzVMpuk7+ZMUKAv2RgAAABOrCv8DoyOxX8znUR9tbT3f44QZdd/pZqjPljn5S/1/qXUb5JjTkpgN9337ja9veWAUmOD9fGdo+VlMZ94bQAAADidyu+//DXeDcWG+qlHmL8OltZo2/5SndM70tUlAQAAAACMUFUk7VrpCFL2/k9qrD1yn3+E1G+iYz5Kr/MlnyMzNrdkFevtLQckSY9dMZBABQAAoJ0QqriptMRwHSyt0ZbsEkIVAAAAAHBnxZnOQfPK2SjZbUfuC0uQUidLqZOk+LMly7Fv4xusNj343veSpF+PiFdaYkRHVQ4AAOBxCFXcVFpiuD7cdoi5KgAAAADgbux2KXfbkfkoBT+0vD/2TCn1EseOlJgBPzto/vUNWdqZX6HwAG/9+aLUdiwcAAAAhCpuKi0xXJKUkVMim80us/nkv2QDAAAAAFzI2iBlf9kUpKyQyg8cuc9kkZLOdQQp/SY6dqe0Um5Zjf66apck6f6JqQoP9DG6cgAAAByFUMVNpcYGy9/booraRu0prFTfmGBXlwQAAAAAOFpdpbR3ddOg+ZVSbdmR+7wDHIPmUy+R+lwoBbStZdejH29XVb1VaYnhujot3qDCAQAAcCKEKm7Ky2LWkPgwbdx3WOnZJYQqAAAAANAZVBZIO//rCFL2rZGsdUfuC4hsGjR/idTrPMnb/7QutWZngVZ8lyeL2aS/XD6QDgYAAAAdgFDFjaUlhjtDlSlntX57OAAAAADAYIU7pY/udgyal/3I8fBkx2yU1Euk+LMks8WQy9U2WPXwB45ZLDedk6Qz4kIMWRcAAAAnR6jixtKSmuaqMKweAAAAAFynsV565yapYLvj5+5DjwQpUak/O2i+LV5es1c5xdWKCfHVPRf0NXx9AAAAHB+hihsbFu8IVfYVVelwZZ26Bfm6uCIAAAAA8EBfPusIVAK6SbesliKS2/VymUVVennNXknSw5cMUJAvb+0BAAA6itnVBaDtQgO81Sc6SJKUkVPq2mIAAAAAwBMV7pTWPem4PfHJdg9U7Ha7Hv7ge9VbbRrbN0qTBsW26/UAAADQEqGKm0tLdOxWSacFGAAAAAB0LJtN+vAPkrVe6nOhNPCqdr/kiu/y9MXuIvl4mTX30gEytUNrMQAAAJwYoYqbG5bIXBUAAAAAcIn0RdL+ryTvQOni+e0yO+VoFbUNmvuxYzj97eelKCkysF2vBwAAgGMRqri55p0q2w6Uqr7R5uJqAAAAAMBDlB2UVs1x3B4/WwqLb/dLLvhst/LL65TYLUC3j0tp9+sBAADgWIQqbq5XZKDCA7xV12jT9txyV5cDAAAAAF2f3S4t/6NUXyH1HCGNuKXdL7n9ULkWb8iSJD1y6QD5eVva/ZoAAAA4FqGKmzOZTMxVAQAAAICOtP19add/JbO3dOnzkrl9Aw6bza5Z738nq82uSYNiNa5fdLteDwAAACdGqNIFDHOGKsUurgQAAAAAurjqYmnFnxy3x/xRij6j3S/5Tvp+ZeSUKtDHoocvGdDu1wMAAMCJEap0AWkJR3aq2O12F1cDAAAAAF3Ypw9JVYVSZD9pzIx2v1xxVb3m/XeHJOmeC/oqNtSv3a8JAACAEyNU6QLO7BkmL7NJ+eV1Olha4+pyAAAAAKBr2vu5tPVfkkyOtl9evu1+ySf+u0Ol1Q1KjQ3Wjecktfv1AAAAcHKEKl2Av49FA7qHSGKuCgAAAAC0i/pq6eO7HbdH3CIljGz3S6ZnF2vplv2SpL9cPlDeFt7CAwAAuBq/kXURzXNVMghVAAAAAMB4a+ZJJVlSSA/plw+3++UarTY9+N73kqRrhvfU8KSIdr8mAAAAfh6hSheR1jysPodQBQAAAAAMdWirtPEFx+2L50t+Ie1+ycUbsrQjr0JhAd66f+IZ7X49AAAAtA6hShfRHKr8mFuhqrpGF1cDAAAAAF2EtUH6cLpkt0kDr5L6XdTul8wrq9VfV+2SJN1/UaoiAn3a/ZoAAABoHUIVV7DbHV8Gigv1V48wf1ltdm3bX2ro2gAAAADgsTa+IOV9J/mHSxc90SGXfPTj7aqqt2poQpiuGR7fIdcEAABA67g0VFm3bp0mT56s7t27y2Qy6f333//Zx6xZs0bDhg2Tr6+vevfurcWLF7d7nYb66G7pmVQpd5vhSzfPVWFYPQAAAAAY4PBeac3/OW5PeFwKimr3S67dVajl3+XKbHIMpzebTe1+TQAAALSeS0OVqqoqDR48WC+++GKrzs/MzNTFF1+s888/X1u3btXdd9+tW265RZ988kk7V2qg8kNSZZ6Utd7wpdMSwiQxVwUAAAAATpvdLn10l9RYK/U6Xxo8pd0vWdtg1ewPHMPpbzonWQO6h7b7NQEAAHBqvFx58YkTJ2rixImtPn/hwoVKTk7WM888I0k644wztH79ev31r3/VhAkT2qtMYyWPkXZ/ImV9IZ0z3dCl0xIjJEkZ2SWy2ex8ogkAAAAA2uqbfzret3kHSJMXSKb2f3+1cO1eZR2uVkyIr+65oE+7Xw8AAACnzq1mqmzcuFHjx49vcWzChAnauHHjCR9TV1en8vLyFl8ulTTa8T17g2Q1dqB8alyw/L0tKq9t1N7CSkPXBgAAAACPUZEnfTLLcfv8B6XwpHa/ZFZRlV5as1eS9NAl/RXs593u1wQAAMCpc6tQJS8vTzExMS2OxcTEqLy8XDU1Ncd9zLx58xQaGur8io938ZC/2DMlv1CprlzKM3auirfFrMHxju3hzFUBAAAAgDZa8SeprkzqPlQa+bt2v5zdbtfDH/6g+kabxvSJ1MWD4tr9mgAAAGgbtwpV2mLmzJkqKytzfu3fv9+1BZktUuK5jtvtMFdleFMLMEIVAAAAAGiDHz+SfvxQMlmkS5+XLO3fNfu/3+dp3a5C+VjMeuTSATJ1QKsxAAAAtI1bhSqxsbHKz89vcSw/P18hISHy9/c/7mN8fX0VEhLS4svlksY4vmd+YfjSaYnhkghVAAAAAOCU1ZRKy+913D73Lil2ULtfsrKuUXM/2i5J+t24FPWKCmr3awIAAKDt3CpUGTVqlFavXt3i2KpVqzRq1CgXVdRGzXNVcjZK1gZDlx6aECZJ2ldUpeKqekPXBgAAAIAu7bM5UmWeFJEinXdfh1xywapdyiuvVUJEgH4/LqVDrgkAAIC2c2moUllZqa1bt2rr1q2SpMzMTG3dulU5OTmSHK27pk6d6jz/d7/7nfbt26f77rtPO3bs0EsvvaS3335b99xzjyvKb7uYgZJ/uFRfKR3aaujSYQE+6h3t+GRTBrtVAAAAAKB1sr6U0l9z3L70Ocn7+N0QjPRjbrle25AlSXrksgHy87a0+zUBAABwelwaqmzZskVDhw7V0KFDJUkzZszQ0KFD9fDDD0uScnNznQGLJCUnJ2v58uVatWqVBg8erGeeeUavvPKKJkyY4JL628xsPmquSju0AEtoagGWQ6gCAAAAAD+roVb66A+O22k3Heku0I5sNrtmvf+9rDa7Jg6M1fn9otv9mgAAADh97T9x7yTGjRsnu91+wvsXL1583Md888037VhVB0kaI+342BGqjJlh6NJpieFaumU/c1UAAAAAoDXWPSkd3iMFxUrjH+mQS76bfkDp2SUK8LHooUv6d8g1AQAAcPrcaqZKl5LcNKw+5yup0djZJ8OahtVv21+qBqvN0LUBAAAAoEvJ+0768lnH7YuflvzD2v2SJVX1mvffHyVJd4/vo+5h7d9qDAAAAMYgVHGVqDOkgG5SQ7V0yNidNylRgQoL8FZdo03bD5UbujYAAAAAdBk2q/ThnZKtUTpjsuOrAzz5yQ6VVDeoX0ywpp2b3CHXBAAAgDEIVVzFbD7SpzdrnaFLm0wm51yVLbQAAwAAAIDj27TQ8SE331Bp4lMdcsn07BL9e/N+SdJfrhgobwtvywEAANwJv725UlJTC7BM44fVN7cAyyBUAQAAAIBjlWRJ//uL4/aFj0ohce1+yUarTbPe/16S9Ku0nhqRFNHu1wQAAICxCFVcqTlU2b9JaqwzdOm0xOadKsWy2+2Grg0AAAAAbs1ulz6629GOOWmMNGxqh1z29Y3Z+jG3XKH+3po5MbVDrgkAAABjEaq4UlQ/KTBKaqyVDqYbuvTgnmGymE3KL6/TobJaQ9cGAAAAALe27S1p3+eSxVea/KxkMrX7JfPKajX/052SpD9flKpuQb7tfk0AAAAYj1DFlUymI3NVDG4B5u9j0YDuIZIcPXsBAAAAAJIqC6VPZjpuj7tf6pbSIZf9y/Ltqqq3akh8mH49Ir5DrgkAAADjEaq4WnMLsKx2mKuSwFwVAAAAAGhh5f1STYkUM0g6584OueQXuwv18be5Mpukv1w+UGZz+++MAQAAQPsgVHG15LGO7/s3Sw3GtukanuQIVdipAgAAAACSdn0iff+uZDJLlz4nWbzb/ZK1DVY91DScfuqoJA3sEdru1wQAAED7IVRxtW69paBYyVonHfja0KWbh9Vvzy1XVV2joWsDAAAAgFupq5A+nuG4PeoOqcewDrns39ftU9bhakUH++qPF/btkGsCAACg/RCquNrRc1UMbgEWF+qv7qF+strs2nag1NC1AQAAAMCtrJ4rlR+QwpOkcQ90yCWzD1fphc/3SJJmXdJfwX7tvzMGAAAA7YtQpTNIbpqrYvCwekkalshcFQAAAAAeLmeTtPkfjtuXLJB8Atr9kna7XQ9/8IPqG206t3c3TT4zrt2vCQAAgPZHqNIZNA+rP7hFqq82dOnmFmDMVQEAAADgkRrrpA/vlGSXhlwvpZzfIZf95Ic8rd1VKB+LWY9eNlAmE8PpAQAAugJClc4gopcU0kOy1ksHNhu6dHOokpFTKpvNbujaAAAAANDprf+rVLRTCoySLvxLh1yyqq5Rj3y0XZL0/87rpV5RQR1yXQAAALQ/QpXO4Oi5Kga3ADsjLkT+3haV1TRoX1GloWsDAAAAQKdWsENa97Tj9sQnpYCIDrnss6t3K7esVvER/rrj/N4dck0AAAB0DEKVzqK5BZjBw+q9LWYNjg+VRAswAAAAAB7EZnW0/bI1SH0nSgOu6JDL7sgr16vrMyVJcy8dKD9vS4dcFwAAAB2DUKWzaB5WfzBdqq8ydOnmFmBbsghVAAAAAHiIr191tFf2CZYufsbRIaCd2Wx2zXrve1ltdk0YEKPzU6Pb/ZoAAADoWIQqnUVYohQaL9kapZyvDF3aOaw+h1AFAAAAgAco3S+tfsRxe/xsKbRHh1z2PxkHtCW7RP7eFj08eUCHXBMAAAAdi1ClszCZ2q0F2NB4R6iyr7BKxVX1hq4NAAAAAJ2K3S4tnyHVV0rxI6Xhv+2Qy5ZU1Wvef3dIku4e30c9wvw75LoAAADoWIQqnUlzCzCDh9WHB/ooJSpQkvQNu1UAAAAAdGXf/0fa/alk8ZEufV4yd8zb3iWbslVcVa8+0UG6eXRyh1wTAAAAHY9QpTNJGu34fugbqa7C0KWdLcAYVg8AAACgq6oulv77Z8ftsX+Sovp12KX3FTlmY14+tIe8LbzVBgAA6Kr4Ta8zCUtwzFaxW9tvrgqhCgAAAICu6pMHpOoiKeoM6dy7O/TS+eW1kqS4UL8OvS4AAAA6FqFKZ+NsAbbO0GXTEiMkSdsOlKrBajN0bQAAAABwuT2rpW3/lmRytP3y8unQy+eWOUKVWEIVAACALo1QpbNJGuv4nrXe0GV7RQYqLMBbtQ02bT9UbujaAAAAAOBS9VXSx3c7bo/8f1L8iA4vIb85VAkhVAEAAOjKCFU6m+a5Krlbpdoyw5Y1m00alkALMAAAAABd0OePS6U5Umi89ItZHX75itoGVdVbJbFTBQAAoKsjVOlsQntIEb0ku03K3mjo0s65KjmEKgAAAAC6iIPp0lcvOW5f8lfJN7jDS8hr2qUS4uelAB+vDr8+AAAAOg6hSmeU1DRXJesLQ5dt3qmSwU4VAAAAAF2BtUH68A+OD6UNukbqc4FLysgrZ54KAACApyBU6YySm+eqGBuqDI4PlcVsUm5ZrQ6V1hi6NgAAAIC2efHFF5WUlCQ/Pz+NHDlSmzdvPuG5DQ0Nmjt3rlJSUuTn56fBgwdr5cqVp7WmW/vyWSn/e8k/QrponsvKaN6pEsM8FQAAgC6PUKUzcs5V+VaqMW5XSYCPl/rHhUhirgoAAADQGSxdulQzZszQ7NmzlZGRocGDB2vChAkqKCg47vmzZs3S3/72Nz3//PPavn27fve73+mKK67QN9980+Y13VbRbmntk47bF/2fFBjpslKaQ5U4dqoAAAB0eYQqnVFwrNStjyS7lL3B0KWdc1UIVQAAAACXmz9/vm699VZNmzZN/fv318KFCxUQEKBFixYd9/x//vOfeuCBBzRp0iT16tVLt99+uyZNmqRnnnmmzWtKUl1dncrLy1t8dWo2m/TRXZK1Tkr5pXTmNS4tx9n+i50qAAAAXR6hSmeV3DRXJdPYFmCEKgAAAEDnUF9fr/T0dI0fP955zGw2a/z48dq4ceNxH1NXVyc/v5Z/uPf399f69evbvKYkzZs3T6Ghoc6v+Pj403lq7S/jdSn7S8k70DGc3mRyaTn5TaFKDDtVAAAAujxClc7KOax+vaHLNocq23PLVV3faOjaAAAAAFqvqKhIVqtVMTExLY7HxMQoLy/vuI+ZMGGC5s+fr927d8tms2nVqlVatmyZcnNz27ymJM2cOVNlZWXOr/3795/ms2tH5bnSqocdt3/5kBSe6Np6JOXS/gsAAMBjEKp0Vs1zVfK/k6qLDVu2e5i/4kL9ZLXZtW1/mWHrAgAAAGh/zz77rPr06aPU1FT5+Pho+vTpmjZtmszm03tr5+vrq5CQkBZfnZLdLq24V6orl3qkSWfd5uqKJB21U4X2XwAAAF0eoUpnFRQtRaU6bhu8W2VY026VjBxagAEAAACuEhkZKYvFovz8/BbH8/PzFRsbe9zHREVF6f3331dVVZWys7O1Y8cOBQUFqVevXm1e0638+KG042PJ7CVd+rxktri6ItU1WlVUWS9Jigv1d3E1AAAAaG+EKp1Ze7UAS2CuCgAAAOBqPj4+SktL0+rVq53HbDabVq9erVGjRp30sX5+furRo4caGxv1n//8R5dddtlpr9np1ZRIK/7kuD36HilmgGvraVJQXidJ8vEyKzzA28XVAAAAoL0RqnRmzS3AstpnWH1GTolsNruhawMAAABovRkzZugf//iHXn/9df3444+6/fbbVVVVpWnTpkmSpk6dqpkzZzrP37Rpk5YtW6Z9+/bpiy++0EUXXSSbzab77ruv1Wu6rVUPS5X5Urc+0ph7XV2N05HWX74ymUwurgYAAADtzcvVBeAkmneqFGyXqoqkwEhDlu3fPUR+3maVVjdoX1GVekcHGbIuAAAAgFNz7bXXqrCwUA8//LDy8vI0ZMgQrVy50jloPicnp8W8lNraWs2aNUv79u1TUFCQJk2apH/+858KCwtr9ZpuKXOdlPGG4/alz0nenWd2iXNIfQitvwAAADwBoUpnFthNih4gFfzg2K0y4ApDlvW2mDW4Z5g2ZRYrPbuYUAUAAABwoenTp2v69OnHvW/NmjUtfj7vvPO0ffv201rT7TTUSB/d5bg9/LdS4jmurecnnDtVQjtP0AMAAID2Q/uvzi65neaqJDJXBQAAAIAbWPN/UvE+Kbi7NH62q6s5Rl7TTpXYEF8XVwIAAICOQKjS2TXPVclsn7kqhCoAAAAAOq3cbdKG5x23L35G8gt1bT3Hkdu0UyU2lPZfAAAAnoBQpbNLPFeSSSraKVXkG7bs0ARHqLK3sEolVfWGrQsAAAAAhrA2Sh/eKdmtUv/LpdRJrq7ouPKdO1Vo/wUAAOAJCFU6u4AIKXag43a2cS3AIgJ91CsqUJL0zX52qwAAAADoZL56ybFTxS9Umvikq6s5oTznThXafwEAAHgCQhV3kDTW8d3oFmAJtAADAAAA0AkV75M+f9xx+8LHpOAY19ZzAjab3TmonvZfAAAAnoFQxR00z1XJMjZUGZ5EqAIAAACgk7HbpY/ukhprpOSx0tDfuLqiEyqurleD1S6TSYoOZqcKAACAJyBUcQeJ50gms3R4j1Sea9iyzcPqt+4vVYPVZti6AAAAANBmW5dImeskLz9p8rOSyeTqik4or2meSmSQr7wtvL0GAADwBPzW5w78w6TYMx23s4ybq9IrMkih/t6qbbDpx9xyw9YFAAAAgDZLGOXYoXL+A1JEL1dXc1J5DKkHAADwOIQq7sLZAmydYUuazSYNSwiTRAswAAAAAJ1EtxRp6ofSqOmuruRnNQ+pjyFUAQAA8BiEKu4iuZ2G1ScyVwUAAABAJ2MySWaLq6v4Wc07VeJCCVUAAAA8BaGKu0gYJZksUkmmVHbAsGWHNYUqGYQqAAAAAHBKmneqxBKqAAAAeAxCFXfhFyJ1H+K4beBclSHxYbKYTTpUVqtDpTWGrQsAAAAAXV0+7b8AAAA8DqGKO2meq2JgC7AAHy/1jwuRJGXksFsFAAAAAForl/ZfAAAAHodQxZ0kNc1VMXBYvXRkrsqWLEIVAAAAAGit/DJ2qgAAAHgaQhV3knC2ZPaSSnOkkmzDlnXOVWGnCgAAAAC0SmVdoyrqGiUxUwUAAMCTEKq4E98gqfswx20D56o071T54VC5qusbDVsXAAAAALqqvKZdKsG+Xgry9XJxNQAAAOgohCrupnmuSpZxc1W6h/opNsRPVptd3x4oM2xdAAAAAOiqnEPq2aUCAADgUQhV3E3yGMf3zC8ku92QJU0mk3O3Sno2LcAAAAAA4Oc0D6mPZZ4KAACARyFUcTfxIyWzt1R+QCrJMmxZ51wVQhUAAAAA+FnNO1WYpwIAAOBZCFXcjU+g1CPNcdvAFmDDm3eq5JTIbtAOGAAAAADoqvLYqQIAAOCRCFXc0dEtwAzSv3uI/LzNKq1u0N7CKsPWBQAAAICuyNn+i50qAAAAHoVQxR0lNYUqWcbNVfG2mHVmzzBJtAADAAAAgJ/jbP/FThUAAACPQqjijuLPkiw+UkWuVLzPsGUZVg8AAAAArZPHTBUAAACPRKjijrz9pZ4jHLcz1xm2bFrCkbkqAAAAAIDja7DaVFRZJ4lQBQAAwNMQqriro1uAGWRY006VPQWVKq2uN2xdAAAAAOhKCirqZLdL3haTIgJ8XF0OAAAAOhChirtqHlaftd6wuSoRgT7qFRkoSfomp9SQNQEAAACgq8lrGlIfHewns9nk4moAAADQkQhV3FWP4ZLFV6rMl4p2G7Zs81yVLdnFhq0JAAAAAF1Jc6gSR+svAAAAj0Oo4q68/RwD6yUpy8C5KgyrBwAAAICTah5SH0OoAgAA4HEIVdxZ8ljH90zj5qo0hyrb9pepwWozbF0AAAAA6CryymokSbEhhCoAAACehlDFnSUZP1clJSpIIX5eqmmwakduhSFrAgAAAEBXkldeJ4n2XwAAAJ6IUMWd9RgmeflL1UVS4Q5DljSbTRrmbAHGXBUAAAAA+Kn8ppkqMexUAQAA8DiEKu7My1dKGOm4bWQLsISmUCWn1LA1AQAAAKCryC13tP9ipwoAAIDnIVRxd84WYMYPq89gWD0AAAAAtGC325Xf1P6LnSoAAACeh1DF3TUPq8/6UrIZM1h+cHyYLGaTDpbWKLdpACMAAAAAQCqpblB9o+O9F6EKAACA5yFUcXfdh0regVJNsVSw3ZAlA329dEZcsCQpnd0qAAAAAODU/MGzyCAf+XjxlhoAAMDT8Bugu7N4SwlnO25ntcNcFUIVAAAAAHDKL2dIPQAAgCcjVOkKkpvnqqw3bMlhzFUBAAAAgGPkljlClVhCFQAAAI9EqNIVJB0Vqhg0V6V5WP0Ph8pVU281ZE0AAAAAcHf5zaFKKKEKAACAJyJU6Qrihkg+wVJtqZT/nSFL9gjzV0yIrxptdn17oNSQNQEAAADA3eWVs1MFAADAkxGqdAUWLylxlON2pjFzVUwmk3O3SnoOLcAAAAAAQDrS/iuGnSoAAAAeiVClq0gyfq5KWmKEJCk9i1AFAAAAAKQjg+rjCFUAAAA8EqFKV5E02vE9e4NkM2YGytE7Vex2uyFrAgAAAIA7y2NQPQAAgEcjVOkq4gZLvqFSXZmUu82QJfvHhcjXy6zS6gbtK6oyZE0AAAAAcFfV9Y0qr22UxKB6AAAAT0Wo0lWYLVLiOY7bWcbMVfHxMmtwzzBJUno2LcAAAAAAeLbmXSqBPhYF+3m7uBoAAAC4gstDlRdffFFJSUny8/PTyJEjtXnz5pOev2DBAvXr10/+/v6Kj4/XPffco9ra2g6qtpNrbgFm4FyVYU0twDIIVQAAAAB4uLxyhtQDAAB4OpeGKkuXLtWMGTM0e/ZsZWRkaPDgwZowYYIKCgqOe/6bb76p+++/X7Nnz9aPP/6oV199VUuXLtUDDzzQwZV3UslNw+qzN0rWRkOWdM5VIVQBAAAA4OGad6owpB4AAMBzuTRUmT9/vm699VZNmzZN/fv318KFCxUQEKBFixYd9/wNGzbo3HPP1XXXXaekpCRdeOGFmjJlys/ubvEYMYMkvzCpvkLK3WrIksMSwiRJuwsqVVbdYMiaAAAAAOCOnDtVGFIPAADgsVwWqtTX1ys9PV3jx48/UozZrPHjx2vjxo3Hfcw555yj9PR0Z4iyb98+rVixQpMmTTrhderq6lReXt7iq8sym49qAWbMXJVuQb7qFRkoScrIYbcKAAAAAM/VvFMlllAFAADAY7ksVCkqKpLValVMTEyL4zExMcrLyzvuY6677jrNnTtXo0ePlre3t1JSUjRu3LiTtv+aN2+eQkNDnV/x8fGGPo9OpzlUyTQmVJGOzFWhBRgAAAAAT0b7LwAAALh8UP2pWLNmjR5//HG99NJLysjI0LJly7R8+XI9+uijJ3zMzJkzVVZW5vzav39/B1bsAklNc1VyvpKsxrTrYq4KAAAAAEj5tP8CAADweF6uunBkZKQsFovy8/NbHM/Pz1dsbOxxH/PQQw/phhtu0C233CJJGjRokKqqqnTbbbfpwQcflNl8bEbk6+srX19f459AZxXdX/KPkGqKpYMZUsLI016yOVTZur9UjVabvCxulcUBAAAAgCFym9t/sVMFAADAY7nsr+M+Pj5KS0vT6tWrncdsNptWr16tUaNGHfcx1dXVxwQnFotFkmS329uvWHfSDnNVekcFKSzAWzUNVm3dX2rImgAAAADgThqtNhVV1kkiVAEAAPBkLt1yMGPGDP3jH//Q66+/rh9//FG33367qqqqNG3aNEnS1KlTNXPmTOf5kydP1ssvv6y33npLmZmZWrVqlR566CFNnjzZGa5AR1qAGRSqmM0mjekTJUlau6vQkDUBAAAAwJ0UVtbJZpe8zCZFBnpQNwQAAAC04LL2X5J07bXXqrCwUA8//LDy8vI0ZMgQrVy50jm8Picnp8XOlFmzZslkMmnWrFk6ePCgoqKiNHnyZD322GOuegqdU3LzXJVNUmOd5HX6v/Cf1zdKH207pLW7CvXHC/ud9noAAAAA4E6aW3/FhPjJbDa5uBoAAAC4iktDFUmaPn26pk+fftz71qxZ0+JnLy8vzZ49W7Nnz+6AytxYVKoUEClVF0kH06XEc057ybF9IyVJ3x4oU1FlnSKD+GQWAAAAAM+R7wxVeC8EAADgyZg43hWZTEfNVVlvyJLRwX4a0D1EkvTFblqAAQAAAPAseeUMqQcAAAChStfV3AIsc51hS57Xt2muyk5CFQAAAACeJa9pp0psiL+LKwEAAIArEap0VUljHd/3b5Yaag1ZsjlUWbe7SDab3ZA1AQAAAMAdHNmpQvsvAAAAT0ao0lVF9pGCYiRrnXRwiyFLDksMV7Cvl4qr6vXdwTJD1gQAAAAAd3D0oHoAAAB4LkKVrurouSqZXxiypLfFrHN7OwbWr91FCzAAAAAAniO/aadKXCjtvwAAADwZoUpXltQ0VyXLmFBFks7r1zRXhVAFAAAAMMSLL76opKQk+fn5aeTIkdq8efNJz1+wYIH69esnf39/xcfH65577lFt7ZGWv3PmzJHJZGrxlZqa2t5Po0uz2+1HzVRhpwoAAIAn83J1AWhHyU1zVQ58LTXUSN6n/4mq5rkq3+SUqLS6XmEBPqe9JgAAAOCpli5dqhkzZmjhwoUaOXKkFixYoAkTJmjnzp2Kjo4+5vw333xT999/vxYtWqRzzjlHu3bt0k033SSTyaT58+c7zxswYIA+++wz589eXrz1Ox2l1Q2qa7RJkqJDmKkCAADgydip0pVF9JKCu0vWesfAegN0D/NX35gg2ezS+j1FhqwJAAAAeKr58+fr1ltv1bRp09S/f38tXLhQAQEBWrRo0XHP37Bhg84991xdd911SkpK0oUXXqgpU6Ycs7vFy8tLsbGxzq/IyMiOeDpdVvOQ+ohAH/l5W1xcDQAAAFyJUKUrO3quipEtwJp2q6zdSQswAAAAoK3q6+uVnp6u8ePHO4+ZzWaNHz9eGzduPO5jzjnnHKWnpztDlH379mnFihWaNGlSi/N2796t7t27q1evXrr++uuVk5Nz0lrq6upUXl7e4gtHNIcqDKkHAAAAoUpXl9w0V8WgYfWSdF5fRxuCtbsKZbfbDVsXAAAA8CRFRUWyWq2KiYlpcTwmJkZ5eXnHfcx1112nuXPnavTo0fL29lZKSorGjRunBx54wHnOyJEjtXjxYq1cuVIvv/yyMjMzNWbMGFVUVJywlnnz5ik0NNT5FR8fb8yT7CKa56nEhRKqAAAAeDpCla6ueVj9wXSpvsqQJUckh8vf26KCijr9mHviN2YAAAAAjLVmzRo9/vjjeumll5SRkaFly5Zp+fLlevTRR53nTJw4UVdffbXOPPNMTZgwQStWrFBpaanefvvtE647c+ZMlZWVOb/279/fEU/HbTSHKuxUAQAAANMKu7rwJCmkp1R+QNq/SUr5xWkv6etl0Tkp3bR6R4HW7ipU/+4hp18nAAAA4GEiIyNlsViUn5/f4nh+fr5iY2OP+5iHHnpIN9xwg2655RZJ0qBBg1RVVaXbbrtNDz74oMzmYz83FxYWpr59+2rPnj0nrMXX11e+vgxgP5H8pvZfsYQqAAAAHo+dKl2dydQ+LcD6OeaqrNlZYNiaAAAAgCfx8fFRWlqaVq9e7Txms9m0evVqjRo16riPqa6uPiY4sVgcg9NP1Jq3srJSe/fuVVxcnEGVe55c2n8BAACgCaGKJ2huAWbgsPpxTXNV0rNLVFHbYNi6AAAAgCeZMWOG/vGPf+j111/Xjz/+qNtvv11VVVWaNm2aJGnq1KmaOXOm8/zJkyfr5Zdf1ltvvaXMzEytWrVKDz30kCZPnuwMV+69916tXbtWWVlZ2rBhg6644gpZLBZNmTLFJc+xK2jeqRJDqAIAAODxaP/lCZJGO74fzJDqKiXfoNNeMqFbgJIjA5VZVKUNew9rwoDjtycAAAAAcGLXXnutCgsL9fDDDysvL09DhgzRypUrncPrc3JyWuxMmTVrlkwmk2bNmqWDBw8qKipKkydP1mOPPeY858CBA5oyZYoOHz6sqKgojR49Wl999ZWioqI6/Pl1Fc07VWj/BQAAAJP9RHvEu6jy8nKFhoaqrKxMISEeNAtkwSCpNEe6/j9Sn/GGLDnnwx+0eEOWppyVoHlXDjJkTQAAABjPY38HRpvx38wRtQ1WpT60UpK0bfaFCvX3dnFFAAAAMNqp/P5L+y9PkTTW8T1rnWFLNs9VWber8IT9mwEAAADAneU17VLx97YoxI9mDwAAAJ6OUMVTtMOw+rOTu8nHy6yDpTXaW1hp2LoAAAAA0Fk4W3+F+slkMrm4GgAAALgaoYqnaJ6rkrtVqi03ZEl/H4tGJkdIktbsLDRkTQAAAADoTJqH1DNPBQAAABKhiucI7SmFJ0t2m5Sz0bBlx/WLliSt3UWoAgAAAKDrySs/slMFAAAAIFTxJM4WYAbOVenrmKuyaV+xqusbDVsXAAAAADqDvDJCFQAAABxBqOJJnMPq1xu2ZEpUoHqE+aveatOmfcWGrQsAAAAAnYEzVKH9FwAAAESo4lma56rkfSvVlBqypMlk0nn9HLtV1uwsMGRNAAAAAOgsmtt/xRCqAAAAQIQqniUkTurW2zFXJXuDYcuOa2oBxlwVAAAAAF1N806VONp/AQAAQIQqniepaa5K1heGLXlO70h5mU3KOlytrKIqw9YFAAAAAFdqtNpUWFkniZkqAAAAcCBU8TTJxocqQb5eGp4ULondKgAAAAC6jqLKelltdlnMJkUG+bq6HAAAAHQChCqeJrF5rsr3UrVxg+XH9YuWRKgCAAAAoOtonqcSHewri9nk4moAAADQGRCqeJrgGCmynyS7lP2lYcue1zRXZePew6ptsBq2LgAAAAC4SvM8FYbUAwAAoBmhiidqbgGWaVwLsNTYYMWE+Kqmwaqvs4zbAQMAAAAArpJXViNJiiVUAQAAQBNCFU+U1NQCLGu9YUuaTCbnbpW1O2kBBgAAAMD95ZUzpB4AAAAtEap4oqSmnSoFP0hVRYYte15f5qoAAAAA6Drym2aqEKoAAACgGaGKJwqMlKL7O24buFtldO9ImU3S7oJKHSytMWxdAAAAAHCF3Kb2X3GEKgAAAGhCqOKpmnerGBiqhAZ4a1hCuCRagAEAAABwf/lN7b8YVA8AAIBmhCqeyjlXxbhh9ZKOzFXZVWDougAAAADQkex2u/LKmtp/EaoAAACgCaGKp0oaLckkFe6QKo0LQM7r5whVvtxzWA1Wm2HrAgAAAEBHKq9pVE2DVRIzVQAAAHAEoYqnCoiQYgY6bhu4W2Vg91B1C/RRZV2j0rNLDFsXAAAAADpSXtOQ+rAAb/l5W1xcDQAAADoLQhVPlmz8XBWz2aSxzhZgzFUBAAAA4J6ah9TT+gsAAABHI1TxZM1zVTLbaa4Kw+oBAAAAuKn8pp0qtP4CAADA0QhVPFniOZJM0uHdUnmuYcuO6RMpk0nanluugqY3IgAAAADgTvLK6iSxUwUAAAAtEap4Mv9wKe5Mx20DW4B1C/LVmT1CJdECDAAAAIB7yit3tP+KIVQBAADAUQhVPF1S81yVdmoBRqgCAAAAwA3llTl23cfR/gsAAABHIVTxdO0VqvRzhCpf7C5So9Vm6NoAAAAA0N7yyh3tv2IIVQAAAHAUQhVPlzhKMpml4n1S2UHDlh3cM0yh/t4qq2nQtgNlhq0LAAAAAB0hr8zR/oudKgAAADgaoYqn8wuV4oY4bhs4V8XLYtboPpGSaAEGAAAAwL3UNlhVUt0giUH1AAAAaIlQBVLSaMf3rHWGLuucq7KzwNB1AQAAAKA9FTS1/vL1MivU39vF1QAAAKAzIVSBlDzW8T3T2Lkq45pClW8PlulwZZ2hawMAAABAe8k9qvWXyWRycTUAAADoTAhVICWcLZksUmm2VJpj2LLRIX46Iy5Edru0fk+RYesCAAAArpSUlKS5c+cqJ8e4353RueSV10qSYmj9BQAAgJ8gVIHkGyx1H+q4beBcFelIC7A1O5mrAgAAgK7h7rvv1rJly9SrVy9dcMEFeuutt1RXx87sriSvzBGqxDKkHgAAAD9BqAKH5DGO70a3AOvnCFXW7SqUzWY3dG0AAADAFe6++25t3bpVmzdv1hlnnKE777xTcXFxmj59ujIyMlxdHgzQvFOFUAUAAAA/RagCh6SmUCXrC8luXPgxLCFcQb5eOlxVrx8OlRu2LgAAAOBqw4YN03PPPadDhw5p9uzZeuWVVzRixAgNGTJEixYtkt3A36vRsfKbQxXafwEAAOAnCFXgkHC2ZPaSyvZLJVmGLevjZdY5Kd0kSWt3FRi2LgAAAOBqDQ0Nevvtt3XppZfqj3/8o4YPH65XXnlFV111lR544AFdf/31ri4RbZRbRqgCAACA4/NydQHoJHwCpR5p0v5NjrkqEcmGLT2uX7Q+3Z6vNTsLNf0XfQxbFwAAAHCFjIwMvfbaa/r3v/8ts9msqVOn6q9//atSU1Od51xxxRUaMWKEC6vE6chnpgoAAABOgJ0qOOLoFmAGGts3UpKUkVOisuoGQ9cGAAAAOtqIESO0e/duvfzyyzp48KCefvrpFoGKJCUnJ+vXv/61iyrE6bDa7CqoqJNEqAIAAIBjsVMFRySPkb542jGs3m6XTCZDlu0ZHqDe0UHaU1CpL/cWadKgOEPWBQAAAFxh3759SkxMPOk5gYGBeu211zqoIhjpcGWdGm12mU1SVJCvq8sBAABAJ8NOFRzR8yzJ4iNVHJKK9xm69Li+UZKkNTuZqwIAAAD3VlBQoE2bNh1zfNOmTdqyZYsLKoKR8pqG1EcF+8rLwltmAAAAtMRviDjCJ0DqMdxx2+AWYOf1c4Qqa3cVym63G7o2AAAA0JHuuOMO7d+//5jjBw8e1B133OGCimCkPIbUAwAA4CQIVdBSctNclUxjQ5URSRHy97Yov7xOO/MrDF0bAAAA6Ejbt2/XsGHDjjk+dOhQbd++3QUVwUjNO1WYpwIAAIDjIVRBS0cPqzdwR4mft0WjUrpJktbsLDRsXQAAAKCj+fr6Kj8//5jjubm58vJibKW7Y6cKAAAAToZQBS31HCFZfKXKfOnwHkOXPq9prspaQhUAAAC4sQsvvFAzZ85UWVmZ81hpaakeeOABXXDBBS6sDEZoDlVi2KkCAACA4yBUQUveflL8WY7bmesMXbo5VNmSXazKukZD1wYAAAA6ytNPP639+/crMTFR559/vs4//3wlJycrLy9PzzzzjKvLw2lqbv8VR6gCAACA4yBUwbGObgFm5LKRgUrsFqAGq10b9hQZujYAAADQUXr06KFvv/1WTz75pPr376+0tDQ9++yz+u677xQfH+/q8nCamkOVGNp/AQAA4Dho+ItjJY+R1kjKWu+Yq2IyGbb0uL5Ren1jttbuKtSFA2INWxcAAADoSIGBgbrttttcXQYMZrfbmakCAACAkyJUwbF6pEleflJVoVS4U4pONWzp8/odCVXsdrtMBgY2AAAAQEfavn27cnJyVF9f3+L4pZde6qKKcLoq6hpVXW+VJMXS/gsAAADH0aZQZf/+/TKZTOrZs6ckafPmzXrzzTfVv39/Pq3VFXj5SvEjpcy1jhZgBoYqZ/fqJh+LWQdKarS3sEq9o4MMWxsAAADoCPv27dMVV1yh7777TiaTSXa7XZKcHxiyWq2uLA+nIb9pl0qIn5cCfPgMIgAAAI7Vppkq1113nT7//HNJUl5eni644AJt3rxZDz74oObOnWtogXCR5Ka5KgYPqw/w8dLIXhGSpLW7Cg1dGwAAAOgId911l5KTk1VQUKCAgAD98MMPWrdunYYPH641a9a4ujychtyy5iH1/i6uBAAAAJ1Vm0KV77//XmeddZYk6e2339bAgQO1YcMGLVmyRIsXLzayPrhK0ljH9+wvJZvN0KXP6xsliVAFAAAA7mnjxo2aO3euIiMjZTabZTabNXr0aM2bN09/+MMfXF0eToNzSD2tvwAAAHACbQpVGhoa5OvrK0n67LPPnD2DU1NTlZuba1x1cJ3uQyXvAKn6sFT4o6FLN4cqX+07rJp6WiMAAADAvVitVgUHB0uSIiMjdejQIUlSYmKidu7c6crScJrynUPqfV1cCQAAADqrNoUqAwYM0MKFC/XFF19o1apVuuiiiyRJhw4dUrdu3QwtEC7i5SMlnO24nfmFoUv3jg5SjzB/1Tfa9FXmYUPXBgAAANrbwIEDtW3bNknSyJEj9eSTT+rLL7/U3Llz1atXLxdXh9OR27RTJZb2XwAAADiBNoUqTzzxhP72t79p3LhxmjJligYPHixJ+vDDD51twdAFJDXNVckyNlQxmUwa29wCbCctwAAAAOBeZs2aJVtTi9y5c+cqMzNTY8aM0YoVK/Tcc8+5uDqcjiM7VWj/BQAAgOPzasuDxo0bp6KiIpWXlys8PNx5/LbbblNAQIBhxcHFnKHKesdcFXObMrjjOq9vlP69OUfrmKsCAAAANzNhwgTn7d69e2vHjh0qLi5WeHi4TCaTCyvD6WoeVB8bSvsvAAAAHF+b/kpeU1Ojuro6Z6CSnZ2tBQsWaOfOnYqOjja0QLhQ9yGST5BUWyrlf2/o0uf27iYvs0n7iqqUc7ja0LUBAACA9tLQ0CAvLy99/33L348jIiIIVLqA/Ob2XyG0/wIAAMDxtSlUueyyy/TGG29IkkpLSzVy5Eg988wzuvzyy/Xyyy8bWiBcyOItJYxy3Da4BViwn7fSEh2h3NpdBYauDQAAALQXb29vJSQkyGq1uroUGKyu0arDVfWSpNhQ2n8BAADg+NoUqmRkZGjMGEdrqHfffVcxMTHKzs7WG2+8QQ/hrib5qBZgBjuvX9NcFVqAAQAAwI08+OCDeuCBB1RcXOzqUmCggvI6SZKPl1nhAd4urgYAAACdVZtmqlRXVys4OFiS9Omnn+rKK6+U2WzW2WefrezsbEMLhIsljXZ8z/pSslkls8Wwpcf1jdaTK3dqw97Dqmu0ytfLuLUBAACA9vLCCy9oz5496t69uxITExUYGNji/oyMDBdVhtORV35kSD2t3AAAAHAibQpVevfurffff19XXHGFPvnkE91zzz2SpIKCAoWEhBhaIFwsdrDkGyLVlUl530rdhxq29BlxwYoK9lVhRZ22ZJXo3N6Rhq0NAAAAtJfLL7/c1SWgHeSVHQlVAAAAgBNpU6jy8MMP67rrrtM999yjX/ziFxo1yjF349NPP9XQocb90R2dgMVLSjxH2rVSyvzC0FDFZDLpvL5Rejf9gNbuKiRUAQAAgFuYPXu2q0tAO3CGKsxTAQAAwEm0aabKr371K+Xk5GjLli365JNPnMd/+ctf6q9//athxaGTcLYAM36uyrimuSprdjKsHgAAAJ7pxRdfVFJSkvz8/DRy5Eht3rz5pOcvWLBA/fr1k7+/v+Lj43XPPfeotrb2tNbEUe2/CFUAAABwEm0KVSQpNjZWQ4cO1aFDh3TgwAFJ0llnnaXU1FTDikMnkdQ0rD57g2RtNHTp0b0jZTZJu/Irdai0xtC1AQAAgPZgNptlsVhO+HUqli5dqhkzZmj27NnKyMjQ4MGDNWHCBBUUHP9DR2+++abuv/9+zZ49Wz/++KNeffVVLV26VA888ECb14RDc6gSQ/svAAAAnESbQhWbzaa5c+cqNDRUiYmJSkxMVFhYmB599FHZbDaja4SrxQ6SAiKl+gppz2eGLh0W4KMh8WGSpHW7Cg1dGwAAAGgP7733npYtW+b8Wrp0qe6//37FxcXp73//+ymtNX/+fN16662aNm2a+vfvr4ULFyogIECLFi067vkbNmzQueeeq+uuu05JSUm68MILNWXKlBY7UU51TTg0t/+KY6cKAAAATqJNM1UefPBBvfrqq/q///s/nXvuuZKk9evXa86cOaqtrdVjjz1maJFwMbNFGvxraeMLUsYbUr+LDF3+vL7Rysgp1Zqdhfr1WQmGrg0AAAAY7bLLLjvm2K9+9SsNGDBAS5cu1W9/+9tWrVNfX6/09HTNnDnTecxsNmv8+PHauHHjcR9zzjnn6F//+pc2b96ss846S/v27dOKFSt0ww03tHlNSaqrq1NdXZ3z5/Ly8lY9h66kOVRhpwoAAABOpk07VV5//XW98soruv3223XmmWfqzDPP1O9//3v94x//0OLFiw0uEZ3CUMebNO1aKVXkGbp081yVL/cUqcHKTicAAAC4p7PPPlurV69u9flFRUWyWq2KiYlpcTwmJkZ5ecf/nfu6667T3LlzNXr0aHl7eyslJUXjxo1ztv9qy5qSNG/ePIWGhjq/4uPjW/08ugKbza58ZqoAAACgFdoUqhQXFx93dkpqaqqKi4tPaa1THaBYWlqqO+64Q3FxcfL19VXfvn21YsWKU7om2iA6VYofKdmt0rZ/G7r0oB6higj0UUVdo77JKTV0bQAAAKAj1NTU6LnnnlOPHj3a9Tpr1qzR448/rpdeekkZGRlatmyZli9frkcfffS01p05c6bKysqcX/v37zeoYvdwuKpejTa7TCYpOtjX1eUAAACgE2tT+6/BgwfrhRde0HPPPdfi+AsvvKAzzzyz1es0D1BcuHChRo4cqQULFmjChAnauXOnoqOjjzm/vr5eF1xwgaKjo/Xuu++qR48eys7OVlhYWFueBk7V0Buk/ZscLcDOvVsymQxZ1mw2aUyfSH2w9ZDW7CzQWckRhqwLAAAAtIfw8HCZjvpd2G63q6KiQgEBAfrXv/7V6nUiIyNlsViUn5/f4nh+fr5iY2OP+5iHHnpIN9xwg2655RZJ0qBBg1RVVaXbbrtNDz74YJvWlCRfX1/5+npumNC8SyUyyFfeljZ99hAAAAAeok2hypNPPqmLL75Yn332mUaNGiVJ2rhxo/bv339Ku0aOHqAoSQsXLtTy5cu1aNEi3X///cecv2jRIhUXF2vDhg3y9vaWJCUlJbXlKaAtBlwhrbxfKt4nZX8pJY02bOlx/aL0wdZDWrurUPdddOwuKAAAAKCz+Otf/9oiVDGbzYqKitLIkSMVHh7e6nV8fHyUlpam1atX6/LLL5ck2Ww2rV69WtOnTz/uY6qrq2U2t/yjv8VikeQId9qyJqTcpnkqscxTAQAAwM9oU6hy3nnnadeuXXrxxRe1Y8cOSdKVV16p2267TX/5y180ZsyYn12jLQMUP/zwQ40aNUp33HGHPvjgA0VFRem6667Tn//8Z+cbiZ9i4KKBfIOkgVdJGa9LGf80NFQZ08cxV+WHQ+UqqKhVdDBvZgAAANA53XTTTYatNWPGDN14440aPny4zjrrLC1YsEBVVVXOD55NnTpVPXr00Lx58yRJkydP1vz58zV06FCNHDlSe/bs0UMPPaTJkyc73xP93Jo4Vh7zVAAAANBKbQpVJKl79+567LHHWhzbtm2bXn31Vf3973//2cefbIBic1DzU/v27dP//vc/XX/99VqxYoX27Nmj3//+92poaNDs2bOP+5h58+bpkUceaeWzws8aNtURqmx/X5r4hOQfZsiykUG+GtQjVN8dLNMXu4p0VVpPQ9YFAAAAjPbaa68pKChIV199dYvj77zzjqqrq3XjjTe2eq1rr71WhYWFevjhh5WXl6chQ4Zo5cqVzvdJOTk5LXamzJo1SyaTSbNmzdLBgwcVFRWlyZMnt3hv9nNr4lj57FQBAABAK7lVs1ibzabo6Gj9/e9/V1pamq699lo9+OCDWrhw4Qkf4+kDFw3XI02K7i811krfvWPo0uP6OXarrNlVaOi6AAAAgJHmzZunyMjIY45HR0fr8ccfP+X1pk+fruzsbNXV1WnTpk0aOXKk8741a9Zo8eLFzp+9vLw0e/Zs7dmzRzU1NcrJydGLL754zJzJk62JYznbf7FTBQAAAD/DZaFKWwYoxsXFqW/fvi1afZ1xxhnKy8tTfX39cR/j6+urkJCQFl84DSaTY7eKJH3zT0OXPq+vI1T5YnehrDa7oWsDAAAARsnJyVFycvIxxxMTE5WTk+OCinC6mgfVs1MFAAAAP8dlocrRAxSbNQ9QHDVq1HEfc+6552rPnj2y2WzOY7t27VJcXJx8fHzavWY0OfNayeIj5W6TDm01bNkh8WEK8fNSaXWDvj1Qati6AAAAgJGio6P17bffHnN827Zt6tatmwsqwulipgoAAABa65Rmqlx55ZUnvb+0tPSULn6qQxlvv/12vfDCC7rrrrt05513avfu3Xr88cf1hz/84ZSui9MUECGlXiL9sMyxW6X7EEOW9bKYNaZPlJZ/l6s1Ows1NCHckHUBAAAAI02ZMkV/+MMfFBwcrLFjx0qS1q5dq7vuuku//vWvXVwd2iKP9l8AAABopVMKVUJDQ3/2/qlTp7Z6vVMdyhgfH69PPvlE99xzj84880z16NFDd911l/785z+fytOAEYZNdYQq374jXfgXydvfkGXP6+sIVdbuKtQ9F/Q1ZE0AAADASI8++qiysrL0y1/+Ul5ejrdUNptNU6dObdNMFbhWRW2DKusaJdH+CwAAAD/PZLfbPWp4RXl5uUJDQ1VWVsZ8ldNhs0nPDZZKc6Qr/i4NvtaQZfPKanX2vNUymaSMWRcoPJC2bgAAAKeL34Hbx+7du7V161b5+/tr0KBBSkxMdHVJhvGk/2b2FFRo/Px1Cvb10nePTHB1OQAAAHCBU/n912UzVeDmzGZp6A2O2xlvGLZsbKifUmODZbdL63YXGrYuAAAAYLQ+ffro6quv1iWXXNKlAhVPk1dWJ4nWXwAAAGgdQhW03ZDrJJNZyl4vHd5r2LLn9YuSJK3dRagCAACAzueqq67SE088cczxJ598UldffbULKsLpYEg9AAAATgWhCtoutKeU8kvH7W/+adiy5/V1hCrrdhXJZvOo7nQAAABwA+vWrdOkSZOOOT5x4kStW7fOBRXhdOSV1UiSYpinAgAAgFYgVMHpGTbV8X3rm5K10ZAlhydGKNDHoqLKOm3PLTdkTQAAAMAolZWV8vE5dvaft7e3ysv5/dXdNO9UiWOnCgAAAFqBUAWnp+9FUmCUVJkv7f7UkCV9vMw6p3ekJFqAAQAAoPMZNGiQli5deszxt956S/3793dBRTgdzTNV2KkCAACA1vBydQFwc14+0uBfSxuedwysTz22DUJbnNc36v+3d+fxUVX3/8ffsyQz2SEJ2TDs+44giBsuUaxWpda1VBStVkSLpVqXb9X2pxVr1fqtWlGK67fuVeuKIgoubMoiUCEsssNkIZDJOklm7u+PyQwEAmSZzJ1MXs/H4z7m5s65J5+ZpmYO75xzNO+HAi3ML9K0M/qEpE8AAAAgFO655x5dfPHF2rx5s84880xJ0vz58/XKK6/orbfeMrk6NJfL7V/+K4tQBQAAAE3ATBW03sj6JcA2fiK594Sky8C+Ksu371NpVW1I+gQAAABC4YILLtC7776rTZs26aabbtLvfvc77dq1S59//rn69OEPgtqbwEwVNqoHAABAUxCqoPW69JO6jZMMn/T9KyHpMjc1Xr27JMjrM7RoU3FI+gQAAABC5fzzz9c333yjiooK/fjjj7rssst02223afjw4WaXhmaoqfNpbwWhCgAAAJqOUAWhMfIq/+OKlyWfLyRdju+XIYl9VQAAABCZvvzyS1199dXKycnRo48+qjPPPFNLliwxuyw0Q2FZtQxDirVZlRofa3Y5AAAAaAcIVRAagydKsUnSvi3Stq9D0uX4/v4lwBZuKJJhGCHpEwAAAGgNl8ulhx56SH379tWll16q5ORkeTwevfvuu3rooYd0wgknmF0imqHAXS1Jykh2yGq1mFwNAAAA2gNCFYRGbII09BL/+YqXQ9Ll2J6pcsZYtae0WhsKykPSJwAAANBSF1xwgfr376/Vq1fr8ccf1+7du/XEE0+YXRZaYU+pP1Rhk3oAAAA0FaEKQuf4+iXAfviPVLWv1d05Y2w6sVeaJGnhhsJW9wcAAAC0xscff6zrrrtOf/rTn3T++efLZrOZXRJayRUIVdhPBQAAAE1EqILQyTleyhwieT3S6jdD0uX4fgeWAAMAAADM9PXXX6usrEyjRo3S2LFj9eSTT6q4uNjsstAKgeW/mKkCAACApiJUQehYLNLxk/3nK16SQrAPyun9/ZvVf7tlnyo8da3uDwAAAGipE088UbNnz9aePXv061//Wq+99ppycnLk8/k0b948lZWVmV0immkPM1UAAADQTIQqCK2hl0o2h1SwRtqzqtXd9UiLV7fUeNV4fVq8eW/r6wMAAABaKSEhQddee62+/vprrVmzRr/73e/00EMPKSMjQxdeeKHZ5aEZgjNVCFUAAADQRIQqCK34VGngBf7zFS+1ujuLxcISYAAAAIhY/fv318MPP6ydO3fq1VdfNbscNJOL5b8AAADQTIQqCL3AEmBr3pJqKlvd3en9/aHKgg2FMkKwpBgAAAAQajabTRMnTtR7771ndiloIsMwVFDqkSRlEqoAAACgiQhVEHo9TpU6dZc8bumH/7S6uxN7pSnWZtWOkiptKa4IQYEAAAAAOrqSihrVeH2SCFUAAADQdIQqCD2rVTr+Kv95CJYAS3DYdULPzpJYAgwAAABAaASW/kpPjFWsnaExAAAAmoZPjmgbIyZJFqu0fZFUvKnV3Z3eL0OStCCfUAUAAABA67lK2aQeAAAAzUeograRnCP1Odt/vrL1s1XG1++rsuTHvaqu9ba6PwAAAAAdG5vUAwAAoCUIVdB2AhvWr3pF8ta2qqu+GYnKTnHKU+fT0i0lISgOAAAAQEcWmKnCfioAAABoDkIVtJ1+E6SEDKmiSNrwSau6slgsOr1+tsqC/MJQVAcAAACgAwuEKtks/wUAAIBmIFRB27HFSCOu9J+HYMP68f38oQqb1QMAAABorcDyX8xUAQAAQHMQqqBtjaxfAmzTPMm9u1VdndQnXTarRT8WVWhHSWUIigMAAADQUbFRPQAAAFqCUAVtK72P1P1kyfBJq/7Vqq6SnTEa1a2zJGarAAAAAGidwEwVlv8CAABAcxCqoO2NvMr/uOJlyedrVVfjg/uqEKoAAAAAaJkKT53KqusksfwXAAAAmodQBW1v0EWSI1nav03a+mWrugrsq7Joc7Fq6loX0AAAAADomAKzVBJibUpyxphcDQAAANoTQhW0vdh4aeil/vMVL7eqq0HZyUpPdKiyxqvvtpWEoDgAAAAAHU0B+6kAAACghQhVEB7H1y8Btu49qbLlYYjVagnOVlnIEmAAAAAAWmAPoQoAAABaiFAF4ZE9QsoaKnlrpNVvtKqrwL4qbFYPAAAAoCUCy39lJceZXAkAAADaG0IVhIfFIh1/tf98xUuSYbS4q1P7pMtqkda7yuSq/wszAAAAAGiqgkCokuIwuRIAAAC0N4QqCJ+hl0g2h1T4X2n3ihZ30zkhVsNzO0mSFm4oDFFxAAAAADqK4PJfySz/BQAAgOYhVEH4xHWWBl3kP1/xUqu6Cu6rwhJgAAAAAJrpwEwVlv8CAABA8xCqILyOn+x/XPNvqaaixd0EQpWvNharzusLRWUAAAAAOggXM1UAAADQQoQqCK8ep0ide0o1ZdJ/321xN8OO66TO8TEqq67Tyh37Q1YeAAAAgOhW6/WpqNwjScpkTxUAAAA0E6EKwstikY6/yn/eiiXAbFaLTu1bvwRYPkuAAQAAAGiaojKPDEOyWy1KTyBUAQAAQPMQqiD8hv9CstikHUukog0t7oZ9VQAAAAA0l6t+P5XMZKesVovJ1QAAAKC9IVRB+CVnS/0m+M9Xtny2ymn1ocqaXaUqKvOEojIAAAAAUS6wn0pmMrNUAAAA0HyEKjDHyPolwFa9KtXVtKiLLkkODemaLEn6aiOzVQAAAAAcWyBUyU6JM7kSAAAAtEeEKjBH33OkxCypsljaMLfF3bAEGAAAAIDmOHj5LwAAAKC5CFVgDptdGvEL/3krNqw/vX+GJOnLDUXy+oxQVAYAAAAgih2YqUKoAgAAgOYjVIF5Rv7S/7jpM6l0Z8u6yO2kJKdd+yprtWZXaQiLAwAAABCNgjNVCFUAAADQAoQqME9ab6nHqZIMadUrLerCbrPqlD7pkqSF+SwBBgAAAODoAjNVslj+CwAAAC1AqAJzHT/Z/7jiZcnna1EXB/ZVKQxVVQAAAACikGEYwZkqLP8FAACAliBUgbkGXiA5UqTS7dKWBS3qYnx/f6iyasd+7a+sCWFxAAAAAKLJ/spa1dT5/5grI9lhcjUAAABojwhVYK6YOGnYZf7zFS+3qIvslDj1z0ySz5C+2lgcwuIAAAAARJM99Ut/pSbEymG3mVwNAAAA2iNCFZgvsATY+g+kir0t6iIwW2XhBvZVAQAAANC4Ajf7qQAAAKB1CFVgvuxhUvZwyVsjrX69RV2c3u9AqOLzGaGsDgAAAECUCOynksV+KgAAAGghQhVEhsBslZUvS0bzQ5FRPTorPtamojKP1rncIS4OAAAAQDQILP+VyUwVAAAAtBChCiLDkEske5xU+IO0a3mzb3fYbTqpd5oklgADAAAA0LiC+lAlm5kqAAAAaCFCFUSGuE7SoIv85ytebFEX4/tnSJIW5BOqAAAAADjcHvZUAQAAQCsRqiByBJYAW/u25Clv9u3j+/r3VVmxbZ/c1bWhrAwAAABAFAjMVGFPFQAAALQUoQoiR/eTpNTeUk259N93mn17t7R49UpPUJ3P0KJNe9ugQAAAAADtGRvVAwAAoLUIVRA5LBbp+Kv85ytealEX4/v7Z6ss3FAYqqoAAAAARIGqGq9Kq/wz2tmoHgAAAC1FqILIMvwXksUm7VwmFa5v9u3j+9WHKvlFMgwj1NUBAAAAaKcCs1TiY21KdtpNrgYAAADtFaEKIktSptT/J/7zlS83+/YTe6XJYbdqd2m1NhU2f18WAAAAINyeeuop9ejRQ06nU2PHjtWyZcuO2Pb000+XxWI57Dj//PODba655prDnj/33HPD8VIimqv0wCb1FovF5GoAAADQXhGqIPKMrF8C7PtXpbqaZt3qjLHpxF5pkqSFG4pCXRkAAAAQUq+//rpmzJih++67TytWrNDw4cM1YcIEFRY2vpzt22+/rT179gSPtWvXymaz6dJLL23Q7txzz23Q7tVXXw3Hy4loLneVJJb+AgAAQOsQqiDy9MmTkrKlyr1S/kfNvj2wBNiCfEIVAAAARLbHHntM119/vaZMmaJBgwZp1qxZio+P13PPPddo+9TUVGVlZQWPefPmKT4+/rBQxeFwNGjXuXPno9bh8XjkdrsbHNHGVeqRJGWzST0AAABagVAFkcdml0ZM8p+3YMP6wGb1y7aUqLKmLpSVAQAAACFTU1Oj5cuXKy8vL3jNarUqLy9PixcvblIfc+bM0RVXXKGEhIQG1xcsWKCMjAz1799fU6dO1d69e4/az8yZM5WSkhI8cnNzm/+CIlxB/Z4qmYQqAAAAaAVCFUSmkb/0P27+XNq/vVm39kpPUG5qnGq8Pi358eiDRwAAAMAsxcXF8nq9yszMbHA9MzNTLpfrmPcvW7ZMa9eu1a9+9asG188991y99NJLmj9/vv7yl79o4cKF+slPfiKv13vEvu666y6VlpYGjx07drTsRUWwPaX+5b+yWP4LAAAArUCogsiU2lPqeZokQ1r1SrNutVgsLAEGAACAqDdnzhwNHTpUY8aMaXD9iiuu0IUXXqihQ4dq4sSJ+uCDD/Ttt99qwYIFR+zL4XAoOTm5wRFtXG7/8l9ZzFQBAABAKxCqIHIdf7X/ceX/Sb4j/1VdY8b3y5DEZvUAAACIXOnp6bLZbCooKGhwvaCgQFlZWUe9t6KiQq+99pquu+66Y36fXr16KT09XZs2bWpVve2di5kqAAAACAFCFUSuAT+VnJ2k0h3Sj18069ZxvdMUY7No295KbS2uaJv6AAAAgFaIjY3VqFGjNH/+/OA1n8+n+fPna9y4cUe9980335TH49Evf/nLY36fnTt3au/evcrOzm51ze1VndenojI2qgcAAEDrEaogcsU4pWGX+89XvNysWxMddp3QI1WStCC/MNSVAQAAACExY8YMzZ49Wy+++KLWrVunqVOnqqKiQlOmTJEkTZ48WXfddddh982ZM0cTJ05UWlpag+vl5eW6/fbbtWTJEm3dulXz58/XRRddpD59+mjChAlheU2RqLi8Rj5DslktSkt0mF0OAAAA2jG72QUAR3X8ZGnZM9L6D6WKYikhvcm3ju/XRYs279Xn+UW65uSebVgkAAAA0DKXX365ioqKdO+998rlcmnEiBGaO3ducPP67du3y2pt+Ldw+fn5+vrrr/Xpp58e1p/NZtPq1av14osvav/+/crJydE555yj+++/Xw5Hxw0TApvUZyQ5ZLNaTK4GAAAA7RmhCiJb1hApZ6S0e6X0/WvSSTc3+da8QZma+fF6fbmhSD/sdmtQTvRttgkAAID27+abb9bNNzf+ObexzeX79+8vwzAabR8XF6dPPvkklOVFhQJ3tSQ2qQcAAEDrsfwXIt/xk/2PK1+WjjB4bEzvLom6YHiOJOmRT/PbojIAAAAA7YCrtD5UYZN6AAAAtBKhCiLfkEukmHipaL2089tm3Trj7H6yWS36fH2hvtta0kYFAgAAAIhke+pnqmQSqgAAAKCVCFUQ+ZzJ0qCJ/vMVLzbr1p7pCbps9HGSpIc/yT/iMgkAAAAAoldB/UyVbJb/AgAAQCsRqqB9CCwBtvYdyVPWrFt/c1ZfxdqtWralRF9uLG6D4gAAAABEMhd7qgAAACBECFXQPnQ7UUrrK9VWSGvfbtat2Slxmnxid0nSXz9Zz2wVAAAAoIMJ7KnC8l8AAABoLUIVtA8Wi3T8Vf7zFS81+/app/dWQqxNa3e59fFaV4iLAwAAABCpDMMIzlRh+S8AAAC0FqEK2o/hV0pWu7TrO6ngh2bdmpbo0HWn9pIkPfppvuq8vraoEAAAAECEKa2qVXWt//M/M1UAAADQWoQqaD8SM6T+P/Gfr3y52bdff2pPdYqP0eaiCr2zcleIiwMAAAAQiQKzVDrHx8gZYzO5GgAAALR3hCpoX0bWb1j//atSnadZtyY5Y3TT6b0lSY9/tlGeOm+oqwMAAAAQYdhPBQAAAKFEqIL2pc9ZUlKOVLVPWv9hs2+fPK6HMpMd2rW/Sq8u3d4GBQIAAACIJIFQJYv9VAAAABAChCpoX6w2aeQv/ect2LDeGWPTb87qK0l68otNqvDUhbI6AAAAABGGTeoBAAAQSoQqaH9GTvI//viFtG9bs2+/bHSuuqfFq7i8Ri8s2hra2gAAAABElAI3y38BAAAgdAhV0P507iH1Ot1/vupfzb49xmbVjLP7SZJmLdys0sra0NUGAAAAIKLsCSz/RagCAACAECBUQft0fP2G9Sv/T/I1f8P5C4blaEBWksqq6zTry80hLg4AAABApGBPFQAAAIQSoQrapwE/leI6S+5d0ubPm3271WrRbef0lyQ9/80WFZZVh7pCAAAAABEgsPwXoQoAAABCISJClaeeeko9evSQ0+nU2LFjtWzZsibd99prr8lisWjixIltWyAij90hDbvCf96CDesl6ayBGRrZrZOqa3168vNNISwOAAAAQCSorvVqX/1yvyz/BQAAgFAwPVR5/fXXNWPGDN13331asWKFhg8frgkTJqiwsPCo923dulW33XabTj311DBViohz/FX+x/yPpPKiZt9usVh0+wT/bJVXl23XjpLKUFYHAAAAwGSBWSrOGKtS4mJMrgYAAADRwPRQ5bHHHtP111+vKVOmaNCgQZo1a5bi4+P13HPPHfEer9erSZMm6U9/+pN69eoVxmoRUTIHS11HSb466ftXW9TFSb3TdWrfdNV6DT3+2cYQFwgAAADATAdvUm+xWEyuBgAAANHA1FClpqZGy5cvV15eXvCa1WpVXl6eFi9efMT7/t//+3/KyMjQddddd8zv4fF45Ha7GxyIIsEN61+WDKNFXQT2Vnln5U5tLCgLVWUAAAAATMZ+KgAAAAg1U0OV4uJieb1eZWZmNriemZkpl8vV6D1ff/215syZo9mzZzfpe8ycOVMpKSnBIzc3t9V1I4IM+bkUkyAVb5B2LG1RF8NzO+ncwVnyGdKjn24IcYEAAAAAzOI6aKYKAAAAEAqmL//VHGVlZbrqqqs0e/ZspaenN+meu+66S6WlpcFjx44dbVwlwsqRJA3+mf+8hRvWS9Lvzukni0Wa+1+Xvt+xPzS1AQAAADBVYPmvTGaqAAAAIERMDVXS09Nls9lUUFDQ4HpBQYGysrIOa79582Zt3bpVF1xwgex2u+x2u1566SW99957stvt2rx582H3OBwOJScnNzgQZQJLgP33Ham6Zcu79c1M0s9GdpUkPfJpfqgqAwAAAGCiwPJf2cxUAQAAQIiYGqrExsZq1KhRmj9/fvCaz+fT/PnzNW7cuMPaDxgwQGvWrNGqVauCx4UXXqgzzjhDq1atYmmvjip3jJTeX6qtlNb+u8Xd/Davn2JsFn21sViLNheHsEAAAAAAZnCxpwoAAABCzPTlv2bMmKHZs2frxRdf1Lp16zR16lRVVFRoypQpkqTJkyfrrrvukiQ5nU4NGTKkwdGpUyclJSVpyJAhio2NNfOlwCwWi3T8Vf7zViwBlpsaryvHdJMk/fWTfBkt3PgeAAAAQGQI7KmSyUwVAAAAhIjpocrll1+uRx55RPfee69GjBihVatWae7cucHN67dv3649e/aYXCUi3rArJGuMtHuF5Frb4m5uPrOPnDFWrdy+X/PXFYawQAAAAADh5PUZKizzSJKyU+JMrgYAAADRwm52AZJ088036+abb270uQULFhz13hdeeCH0BaH9SewiDThP+uE/0sqXpZ/8pUXdZCQ5NeXknnp6wWY98mm+zhyQIavVEuJiAQAAALS1veUeeX2GrBYpPZFVDQAAABAaps9UAUJmZP2G9d+/JtVWt7ibG0/rrSSnXetdZXp/9e4QFQcAAAAgnPbUL/3VJckhu42hLwAAAEKDT5aIHr3PkJKPk6r3S+s/aHE3KfExunF8b0nSY/M2qNbrC1GBAAAAAMLlwCb1LP0FAACA0CFUQfSw2qSRv/Sft2LDekm65qQeSk+M1ba9lXrjux0hKA4AAABAOAU2qc9KdphcCQAAAKIJoQqiy8hJkizSloVSyZYWd5PgsOvmM/pIkv4+f6Oqa70hKhAAAABAOARmqrBJPQAAAEKJUAXRpVM3/zJgkrTqX63q6sqx3dS1U5wK3B69tHhr62sDAAAAEDYF9TNVMpOdJlcCAACAaEKoguhzfP2G9Sv/JXnrWtyNw27T9Ly+kqR/LNissuraUFQHAAAAIAwCG9VnpbD8FwAAAEKHUAXRp/95UlyqVLZb2jy/VV1dPLKrendJ0P7KWv3zq5YvJwYAAAAgvAoCG9Uns/wXAAAAQodQBdHH7pCGX+k/b+WG9XabVb87p78k6Z9f/ai95Z7WVgcAAACgjRmGEdxTJSuF5b8AAAAQOoQqiE7HX+V/3DBXKitoVVc/GZKloV1TVFHj1dMLNoegOAAAAABtyV1dp8oaryQpiz1VAAAAEEKEKohOGQOl406QfHXS96+2qiuLxaLbJvhnq7y0ZJt2768KRYUAAAAA2khg6a+UuBjFxdpMrgYAAADRhFAF0SuwYf3SWVJlSau6Oq1vusb0TFVNnU9PfL4xBMUBAAAAaCuuwCb1zFIBAABAiBGqIHoNuURK6yOV7ZHevUkyjBZ3ZbFY9Pv62SpvfLdTW4orQlUlAAAAgBALhCqZ7KcCAACAECNUQfSKjZcueV6yxUobPpaWPtOq7kb3SNWZAzLk9Rl6bN6GEBUJAAAAINQCm9RnM1MFAAAAIUaoguiWPUw658/+83n3SLtXtaq7287xz1Z5//vd+mG3u5XFAQAAAGgLe5ipAgAAgDZCqILoN+Z6qf/5krdGeutayVPW4q4G5STrguE5kqRHPs0PVYUAAAAAQiiwUX02oQoAAABCjFAF0c9ikS56Uko+TirZLH14W6u6m3F2P9msFn2+vlDfbS0JUZEAAAAAQoWN6gEAANBWCFXQMcSnSj//p2SxSqtfk1a92uKueqYn6LLRx0mSHv4kX4ZhhKpKAAAAACEQ2FMlk1AFAAAAIUaogo6j+zjp9Lv95x/+Tire2OKufnNWX8XarVq2pURfbiwOUYEAAAAAWstT51VJRY0klv8CAABA6BGqoGM5dYbU41SptkJ6a4pUW92ibrJT4jT5xO6SpL9+sp7ZKgAAAECEKHR7JEmxdqs6xceYXA0AAACiDaEKOharTbp4thSfJrnWSPPubXFXU0/vrYRYm9bucuvjta4QFgkAAACgpfYctJ+KxWIxuRoAAABEG0IVdDzJ2dLEWf7zZc9I6z9sUTdpiQ5dd2ovSdKjn+arzusLVYUAAAAAWiiwn0oWS38BAACgDRCqoGPqd4407mb/+bs3SaU7W9TN9af2VKf4GG0uqtDbK3eFsEAAAAAALVFw0EwVAAAAINQIVdBxnXWflDNSqt4vvXWd5K1rdhdJzhjddHpvSdL/frZRnjpviIsEAAAA0BzB5b+YqQIAAIA2QKiCjsseK13ynBSbJO1YIi18qEXdTB7XQ5nJDu3aX6VXl24PcZEAAAAAmqPAzUwVAAAAtB1CFXRsqb2kCx73n3/5iPTjwmZ34Yyx6Tdn9ZUkPfnFJlV4mj/jBQAAAEBo7CmtksRMFQAAALQNQhVg6CXSyKskGdLb10vlRc3u4rLRueqeFq/i8hq9sGhryEsEAAAA0DQFbo8kQhUAAAC0DUIVQJJ+8hcpvb9UXiC9O1Xy+Zp1e4zNqhln95MkzVq4Wfsra9qiSgAAAABH4fMZLP8FAACANkWoAkhSbIJ06fOSzSFtmictearZXVwwLEcDspJUVl2nZ778sQ2KBAAAAHA0xRUe1fkMWSxSlySH2eUAAAAgChGqAAGZg6VzZ/rPP/ujtGt5s263Wi267Zz+kqTnv9miwrLqEBcIAAAA4GgKSv1Lf3VJdCjGxnAXAAAAocenTOBgo6+VBl4o+eqkt66VqkubdftZAzM0slsnVdf69OTnm9qoSAAAAACNcQWW/mI/FQAAALQRQhXgYBaLdOHfpZRu0r6t0vu3SobRjNstun2Cf7bKq8u2a0dJZdvUCQAAAOAwrtIqSVIm+6kAAACgjRCqAIeK6yxdMkey2KT/vi2tfLlZt5/UO12n9k1XrdfQ3z7b0EZFAgAAADhUYKZKNjNVAAAA0EYIVYDG5I6RzvyD//yj30uF65t1e2BvlXdW7tKGgrJQVwcAAACgEa76PVWYqQIAAIC2QqgCHMnJt0q9TpfqqqS3pki1VU2+dXhuJ00YnCnDkB77lNkqAAAAQDi43P7P7FmEKgAAAGgjhCrAkVit0s+elRK6SIU/SJ/c3azbbzunvywWae5/Xfp+x/62qREAAADt3lNPPaUePXrI6XRq7NixWrZs2RHbnn766bJYLIcd559/frCNYRi69957lZ2drbi4OOXl5Wnjxo3heCmmc5Wy/BcAAADaFqEKcDRJmdLPnvGff/ec9N93m3xr38wk/WxkV0nSI5/mt0FxAAAAaO9ef/11zZgxQ/fdd59WrFih4cOHa8KECSosLGy0/dtvv609e/YEj7Vr18pms+nSSy8Ntnn44Yf197//XbNmzdLSpUuVkJCgCRMmqLq6OlwvyzSBUCWTUAUAAABthFAFOJY+Z/mXApOk934j7dvW5Ft/m9dPMTaLvtpYrEWbi9umPgAAALRbjz32mK6//npNmTJFgwYN0qxZsxQfH6/nnnuu0fapqanKysoKHvPmzVN8fHwwVDEMQ48//rj+8Ic/6KKLLtKwYcP00ksvaffu3Xr33XfD+MrCr6y6VhU1Xkks/wUAAIC2Q6gCNMWZf5C6jpY8pdK/r5O8tU26LTc1XleO6SZJ+usn+TIMoy2rBAAAQDtSU1Oj5cuXKy8vL3jNarUqLy9PixcvblIfc+bM0RVXXKGEhARJ0pYtW+RyuRr0mZKSorFjxx61T4/HI7fb3eBobwrc/lkqSU67Ehx2k6sBAABAtCJUAZrCFiNdMkdypEg7v5W++HOTb735jD5yxli1cvt+zV/X+DIOAAAA6HiKi4vl9XqVmZnZ4HpmZqZcLtcx71+2bJnWrl2rX/3qV8Frgfua2+fMmTOVkpISPHJzc5vzUiLCnvqlv5ilAgAAgLZEqAI0Vece0oX/6z//+m/SpvlNui0j2akpJ/eU5N9bxedjtgoAAABab86cORo6dKjGjBnT6r7uuusulZaWBo8dO3aEoMLwCuynksV+KgAAAGhDhCpAcwz+mTRqiv/8nV9LZQVNuu3G03oryWnXeleZ3l+9uw0LBAAAQHuRnp4um82mgoKGnykLCgqUlZV11HsrKir02muv6brrrmtwPXBfc/t0OBxKTk5ucLQ3geW/mKkCAACAtkSoAjTXuTOljEFSRZE/WPH5jnlLSnyMbhzfW5L02LwNqvUe+x4AAABEt9jYWI0aNUrz5x+YAe3z+TR//nyNGzfuqPe++eab8ng8+uUvf9nges+ePZWVldWgT7fbraVLlx6zz/ZuDzNVAAAAEAaEKkBzxcRJlzwv2eOkH7+QFv1vk2675qQeSk+M1ba9lXrju/a3nAIAAABCb8aMGZo9e7ZefPFFrVu3TlOnTlVFRYWmTPHPjp48ebLuuuuuw+6bM2eOJk6cqLS0tAbXLRaLbr31Vj3wwAN67733tGbNGk2ePFk5OTmaOHFiOF6SaYIzVQhVAAAA0IbsZhcAtEsZA6TzHpbeu0Waf7/U/WQp9+hrWSc47Jp2Rh/96f0f9Pf5G/Xz44+TM8YWpoIBAAAQiS6//HIVFRXp3nvvlcvl0ogRIzR37tzgRvPbt2+X1drwb+Hy8/P19ddf69NPP220z9///veqqKjQDTfcoP379+uUU07R3Llz5XRGd9jgYvkvAAAAhIHFMIwOtWu22+1WSkqKSktL2+U6wYgghiH9+zpp7b+llG7SjV9JcZ2OeounzqszH1moXfurdPd5A3TDab3DUysAAOjQ+AyM5mqPPzOjH5in4vIafXDLKRrSNcXscgAAANCONOfzL8t/AS1lsUg//ZvUuYdUut0/a+UYGaXDbtP0vL6SpH8s2Kyy6towFAoAAABEt5o6n4rLayRJ2Sz/BQAAgDZEqAK0hjNFuuQ5yWqX1r0nLX/+mLdcPLKrendJ0P7KWs3+aksYigQAAACiW2A/lVibVakJsSZXAwAAgGhGqAK0VtdRUt4f/edz75IK/nvU5nabVb87p78kac5XP2pvuaeNCwQAAACiWyBUyUh2yGKxmFwNAAAAohmhChAKJ06T+pwt1VVLb06RaiqO2vzcwVka0jVZFTVePb1gc5iKBAAAAKJTYJN6lv4CAABAWyNUAULBapUmPi0lZknF+dLcO4/R3KLbJwyQJL20ZJt2768KR5UAAABAVHKV+kOVzGRCFQAAALQtQhUgVBK7SBc/K8kirXhJWvPWUZuf1jddY3qmqqbOpyc+3xieGgEAAIAoFAhVmKkCAACAtkaoAoRSr/HSabf5z9+/VSo58kb0FotFv5/g31vlje926sei8jAUCAAAAESfwPJfzFQBAABAWyNUAUJt/J1S7olSTZn01rVSXc0Rm47ukaozB2TI6zP0t8+YrQIAAAC0RGCmShYzVQAAANDGCFWAULPZpZ//U3J2knavkD7/f0dt/rtz+kmS3v9+t37Y7Q5DgQAAAEB0YaN6AAAAhAuhCtAWOuVKFz3lP1/0hLRx3hGbDs5J0QXDcyRJj3yaH47qAAAAgKjh8xkqdHsksfwXAAAA2h6hCtBWBv5UGnOD//ydX0vuPUdsOuPsfrJZLfp8faG+21oSpgIBAACA9q+kskY1Xp8kKSOJUAUAAABti1AFaEtn3y9lDpUq90rv3CD5vI0265meoMtGHydJeviTfBmGEc4qAQAAgHYrsJ9KeqJDsXaGuAAAAGhbfOIE2lKMU7r0eSkmQdrypfT1Y0dsesuZfRVrt2rZlhJ9ubE4jEUCAAAA7deBTeodJlcCAACAjoBQBWhr6X2l8x/xn38xU9q2uNFmOZ3idNWJ3SVJf/1kPbNVAAAAgCYIbFKfxX4qAAAACANCFSAchl8pDbtcMrzSv38lVTa+b8pNp/dWQqxNa3e59faKXWEuEgAAAGh/CgKhSgqhCgAAANoeoQoQDhaLdP6jUmovyb1Teu8WqZGZKGmJDl1/Wi9J0h3/Xq33vt8d7koBAACAdmVPKTNVAAAAED6EKkC4OJKkS56XrDHS+g+kZbMbbTbtjD66aESO6nyGpr+2Uq8s3R7mQgEAAID248BMlTiTKwEAAEBHQKgChFPOCOmc+/3nn/6PtGf1YU1ibFb97bIRmjS2mwxDuvudNXr2y83hrRMAAABoJ1zMVAEAAEAYEaoA4Tb2RqnfuZK3RnpriuQpP6yJ1WrRAxOH6Nfj/UuBPfjRej32aT6b1wMAAACHCIYqKQ6TKwEAAEBHQKgChJvFIl30DykpR9q7Sfro9iM0s+jOcwfo9gn9JUl//3yT/vT+D/L5CFYAAAAASSr31KnMUyeJ5b8AAAAQHoQqgBkS0qSfz5YsVun7V6TvX2u0mcVi0bQz+uhPFw6WJL2waKt+/+/VqvP6wlktAAAAEJECs1QSHXYlOuwmVwMAAICOgFAFMEuPU6Txd/jPP5ghFW86YtOrT+qhRy8dLqtFemv5Tt3y6kp56rxhKhQAAACITIFN6jOTWfoLAAAA4UGoApjptNul7qdItRX+/VXqPEds+vNRx+kfk0Yp1mbVx2tduv6l5aqqIVgBAABAxxWYqZLN0l8AAAAIE0IVwExWm3Txs1JcquRaLc2776jNzx2SpX9ePVrOGKu+3FCkyc8tlbu6NkzFAgAAAJHFFZyp4jS5EgAAAHQUhCqA2VK6ShOf9p8vfVpa/9FRm5/Wr4v+77qxSnLY9e3WffrF7CUqqagJQ6EAAABAZAnMVMlKYfkvAAAAhAehChAJ+p8rnXiT//w/N0mlu47afHSPVL16w4lKTYjV2l1uXfbM4uCAEgAAAOgoAjNVslj+CwAAAGFCqAJEirw/StnDpap90r9/JXnrjtp8SNcUvfHrccpKdmpTYbkufWaRtu+tDE+tAAAAQAQIzlRh+S8AAACECaEKECnsDumS56XYRGn7IunNq6XywqPe0icjUW/eOE7d0+K1o6RKl8xapA0FZWEqGAAAADBXYKZKdgqhCgAAAMKDUAWIJGm9pQufkCw2af0H0pMnSCv/JRnGEW/JTY3Xm78ep36ZiSos8+jyZxZr9c794asZAAAAMEGt16fico8kNqoHAABA+BCqAJFmyMXSDV9IWcOk6v3+PVZe/pm0b+sRb8lIdur1G8Zp+HEp2ldZq1/MXqqlP+4NW8kAAABAuBWWeWQYUozNorSEWLPLAQAAQAdBqAJEouzh0vVf+PdZsTulH7+Q/jFOWvyU5PM2ekvnhFj96/oTNbZnqso9dZr83DJ9sf7oy4cBAAAA7VVgP5WMJKesVovJ1QAAAKCjIFQBIpXNLp3yW2nqIqn7KVJtpfTJ3dKcs6WC/zZ6S6LDrhevHaMzB2TIU+fT9S99pw9W7w5z4QAAAEDbC25Sz34qAAAACCNCFSDSpfWWrn5fuuB/JUeytGu59Mxp0ud/luo8hzV3xtj0zFWj9NNh2arzGfrNqyv1xrc7TCgcAAAAaDuBTeqz2E8FAAAAYUSoArQHVqs06hpp2jJpwE8lX5305cPSrFOl7UsPax5js+p/rxipK07Ilc+Qfv/v1Zrz9Zbw1w0AAAC0kQI3M1UAAAAQfoQqQHuSnC1d/n/SpS9KCV2k4nzpuQnSR7dLnrIGTW1Wi2ZePFTXn9pTknT/Bz/o8c82yDAMMyoHAAAAQmpPKTNVAAAAEH6EKkB7Y7FIgyf6Z62M+KUkQ1r2rPTUidLGeYc0teju8wZqxtn9JEmPf7ZRD3y4jmAFAAAA7V5BfaiSyUwVAAAAhFFEhCpPPfWUevToIafTqbFjx2rZsmVHbDt79mydeuqp6ty5szp37qy8vLyjtgeiVnyqNPEp6ap3pU7dJfdO6V+XSP++XqooDjazWCz6zVl9de9PB0mS5ny9RXe9vUZeH8EKAAAA2q/AnirZhCoAAAAII9NDlddff10zZszQfffdpxUrVmj48OGaMGGCCgsLG22/YMECXXnllfriiy+0ePFi5ebm6pxzztGuXbvCXDkQIXqfId20WBp3s2SxSmvekJ4aI61+QzpoRsq1p/TUw5cMk9UivfbtDk1/baVq6nwmFg4AAAC0jGEYbFQPAAAAU1gMk9cBGjt2rE444QQ9+eSTkiSfz6fc3FzdcsstuvPOO495v9frVefOnfXkk09q8uTJx2zvdruVkpKi0tJSJScnt7p+IKLsXC69d4tU+F//133Pkc5/TOqUG2zy4eo9uvX1lar1Gjqjfxc9/ctRcsbYTCoYAACEA5+B0VyR/jNTUlGj4+/3L32b/8C5ctj5PAsAAICWa87nX1NnqtTU1Gj58uXKy8sLXrNarcrLy9PixYub1EdlZaVqa2uVmpra6PMej0dut7vBAUSt40ZJNyyQzviDZIuVNn4q/eNEadlsyeeflXL+sGzNnjxazhirvsgv0tXPLVNZda25dQMAAADN4KrfTyUtIZZABQAAAGFlaqhSXFwsr9erzMzMBtczMzPlcrma1Mcdd9yhnJycBsHMwWbOnKmUlJTgkZub22g7IGrYY6Xxt0s3fi3lnijVlEsf3SY9f65UlC9JOr1/hl66dqwSHXYt3VKiSf9cqn0VNSYXDgAAADSNy10lScpk6S8AAACEmel7qrTGQw89pNdee03vvPOOnM7GP0zfddddKi0tDR47duwIc5WASbr0l6Z8LJ33iBSbKO1YKs06RVr4sFRXozE9U/Xq9Seqc3yMVu8s1eXPLlZh/brUAAAAQCRzlXoksUk9AAAAws/UUCU9PV02m00FBQUNrhcUFCgrK+uo9z7yyCN66KGH9Omnn2rYsGFHbOdwOJScnNzgADoMq1Uac7100xL//ireGumLP0vPni7tXK6hx6XojV+PU0aSQxsKynXJrMXaUVJpdtUAAADAUblK62eqEKoAAAAgzEwNVWJjYzVq1CjNnz8/eM3n82n+/PkaN27cEe97+OGHdf/992vu3LkaPXp0OEoF2rdOudIv3pAu/qcUn+bfyH5OnjT3bvXtbNVbN56k3NQ4bS+p1KWzFmtTYZnZFQMAAABH5KqfYZ3F8l8AAAAIM9OX/5oxY4Zmz56tF198UevWrdPUqVNVUVGhKVOmSJImT56su+66K9j+L3/5i+655x4999xz6tGjh1wul1wul8rLy816CUD7YLFIwy6Vpn0rDb1MMnzSkqekf4xTt/1L9eavT1LfjES53NW67JklWrur1OyKAQAAgEa53P7lv7KYqQIAAIAwMz1Uufzyy/XII4/o3nvv1YgRI7Rq1SrNnTs3uHn99u3btWfPnmD7p59+WjU1NbrkkkuUnZ0dPB555BGzXgLQviSkST+fLU16S0o+Ttq/TXp5orK+mKE3Jg/Q0K4pKqmo0ZXPLtG3W0vMrhYAAAA4TGD5L2aqAAAAINwshmEYZhcRTm63WykpKSotLWV/FcBTJs2/X1r2rCRDSshQ1dkzdfXiHC3btk/OGKueuWq0xvfrYnalAACgFfgMjOaK9J+ZYX/8RO7qOn3629PULzPJ7HIAAADQzjXn86/pM1UAmMiRJJ33sHTtJ1J6f6miUHHvXqdXU57QRb0sqq716VcvfquP1+w5dl8AAABAGFTW1MldXSeJ5b8AAAAQfoQqAKRuY6Ubv5JO+71ktcu24SM9vvcGPdjtO9V5vZr2ygq9tXyn2VUCAAAAcpX6N6mPj7UpyWE3uRoAAAB0NIQqAPzsDunM/5F+/aXUdZQsnjL9ovAxfZb6iLppj25783u98M0Ws6sEAABAB+dy+0OVrBSnLBaLydUAAACgoyFUAdBQ5mDpunnShJlSTLx6V67SPOddutH2nu5/f42e/HyjOthWTAAAAIggBYFQhU3qAQAAYAJCFQCHs9qkcTdJNy2Wep2hGKNGd8a8pv/E3qOP532qhz5eT7ACAAAAU+wpJVQBAACAeQhVABxZ5x7SVe9IE5+WnJ00xLpV/4n9gzot+rPue3u5vD6CFQAAAIRXQemB5b8AAACAcCNUAXB0Fos04hfSzd9Kg38mu8Wnqfb3dc33k/TU8y+o1uszu0IAAAB0IHsIVQAAAGAiQhUATZOYIV36gnTFq6pyZqiX1aXf7LhVix7/parL9pldHQAAADqIwJ4qmSz/BQAAABMQqgBongHnKe7W77Sr9xWSpPFlH6ryb6NUteY9kwsDAABAR+CqD1WymakCAAAAExCqAGg+Z4q6XvWM/nvOq9pqZCvVt1dx/75KNa/8Qtr8uVRXY3aFAAAAiEJ1Xp+KyjyS2KgeAAAA5iBUAdBig086T6XXLNAcTVSdYVXshg+ll38m/bWP9O9fSf99R/KUmV0mAAAAokRRuUc+Q7JZLUpLdJhdDgAAADogu9kFAGjfhvfMkvPGJzX5n6fqp9Uf6GzbcnXxlEpr3vQftlip1+nSgPOl/uf592YBAAAAWsBVv0l9ZpJDNqvF5GoAAADQERGqAGi1/llJeuTmSfr7/DH604rtGuzbqAm2b3VB7ArlePdIGz/1H+/fKuWO9QcsA86X0nqbXToAAADakWCown4qAAAAMAnLfwEIiZxOcXro58O04PdnacRJE/Q3y1U6qfIRne15WHNiJ6kkZbAkQ9qxRJp3j/TE8dJTJ0rz75d2rZAMw+yXAAAAYIqnnnpKPXr0kNPp1NixY7Vs2bKjtt+/f7+mTZum7OxsORwO9evXTx999FHw+T/+8Y+yWCwNjgEDBrT1ywgLNqkHAACA2ZipAiCkslPidO8FgzTtjN56YdFWvbAoRve7j9P97vM1MqVCd/b6UaOrF8m27RupaJ3/+OoRKbmrf3mwAedLPU6RbDFmvxQAAIA29/rrr2vGjBmaNWuWxo4dq8cff1wTJkxQfn6+MjIOXza1pqZGZ599tjIyMvTWW2+pa9eu2rZtmzp16tSg3eDBg/XZZ58Fv7bbo2PoFwhVMtmkHgAAACaJjk/WACJOWqJDvzunv244rZf+b8l2zfl6i1aWSpevHKr0xFGaOu5P+kXqOsVtnitt/Exy75K+ne0/nClS3wn+gKVPnuRINPvlAAAAtInHHntM119/vaZMmSJJmjVrlj788EM999xzuvPOOw9r/9xzz6mkpESLFi1STIz/j1B69OhxWDu73a6srKw2rd0MgeW/sghVAAAAYBKW/wLQppKcMZp6em99fccZuv+iweraKU7F5TW6f/5ujXk/TY92+h/tnbZO+sUb0vGTpfh0qbpUWvOG9ObV0sO9pH9dJi1/USovNPvlAAAAhExNTY2WL1+uvLy84DWr1aq8vDwtXry40Xvee+89jRs3TtOmTVNmZqaGDBmiBx98UF6vt0G7jRs3KicnR7169dKkSZO0ffv2o9bi8XjkdrsbHJEoGKqw/BcAAABMQqgCICycMTZdNa6HFtx+uh69dLh6d0lQWXWdnvh8k05+dJH+lH+cdp/2sHTbBunaT6STbpE695S8HmnjJ9L7v5Ee6SfNmSAtekLau9nslwQAANAqxcXF8nq9yszMbHA9MzNTLper0Xt+/PFHvfXWW/J6vfroo490zz336NFHH9UDDzwQbDN27Fi98MILmjt3rp5++mlt2bJFp556qsrKyo5Yy8yZM5WSkhI8cnNzQ/MiQyyw/BczVQAAAGAWi2F0rN2h3W63UlJSVFpaquTkZLPLATosn8/Qpz+49NQXm7VmV6kkKcZm0cUjj9ONp/dWz/QE/+b1Reul9R9I6z6Q9qxq2EnGIP8SYQPOl7JHSBZL2F8HAADtAZ+BI9Pu3bvVtWtXLVq0SOPGjQte//3vf6+FCxdq6dKlh93Tr18/VVdXa8uWLbLZbJL8S4j99a9/1Z49exr9Pvv371f37t312GOP6brrrmu0jcfjkcfjCX7tdruVm5sbUT8zhmFowD1z5anzaeHtp6t7WoLZJQEAACBKNGfMxJ4qAExhtVp07pBsTRicpa82FusfCzZpyY8lev27HXpz+Q6dNzRbN53eR4NyBkoZA6XTbpdKd0rrP/KHLFu/lgp/8B9f/tW/0X0gYOl+MhvdAwCAiJeeni6bzaaCgoIG1wsKCo64H0p2drZiYmKCgYokDRw4UC6XSzU1NYqNjT3snk6dOqlfv37atGnTEWtxOBxyOBwtfCXhUVpVK0+dTxIb1QMAAMA8LP8FwFQWi0Wn9eui124Yp39PHaezBmTIZ0gfrN6j8/7+la594Vt9t7XE3zjlOGnsDdLV70m/3yz97Flp4IVSTIJ/o/tlz0ovXST9tbf09g3SD/+RPOXmvkAAAIAjiI2N1ahRozR//vzgNZ/Pp/nz5zeYuXKwk08+WZs2bZLP5wte27Bhg7KzsxsNVCSpvLxcmzdvVnZ2dmhfQJjtqd9PpXN8jJwxtmO0BgAAANoGoQqAiDGqe6rmXHOCPvrNqbpgeI6sFunz9YW6ZNZiXfbMYi3cUKTgioVxnaXhl0uXv+wPWK58XRp51YGN7le/Lr0x2b/R/SuXSytekiqKzX2BAAAAh5gxY4Zmz56tF198UevWrdPUqVNVUVGhKVOmSJImT56su+66K9h+6tSpKikp0fTp07VhwwZ9+OGHevDBBzVt2rRgm9tuu00LFy7U1q1btWjRIv3sZz+TzWbTlVdeGfbXF0qB/VSYpQIAAAAzsfwXgIgzKCdZT1w5UjPO7qdnFm7Wv1fs1LItJVq2ZZmGdE3WtNP7aMLgLFmt9XuoxMRJ/c/1Hz6vtGOZf4mw9R9I+7ZKG+b6D8t0KffE+mXCzpNSe5n6OgEAAC6//HIVFRXp3nvvlcvl0ogRIzR37tzg5vXbt2+X1Xrgb+Fyc3P1ySef6Le//a2GDRumrl27avr06brjjjuCbXbu3Kkrr7xSe/fuVZcuXXTKKadoyZIl6tKlS9hfXygV1M9UyU4hVAEAAIB52KgeQMTbU1qlf361Ra8s3a6qWq8kqXeXBE09vY8uGpGjGNsRJt0ZhlS4Tlr/oT9gOWyj+8H+gKXv2VLWUH84AwBAFOIzMJorEn9m/jZvg/53/kZdOSZXMy8eZnY5AAAAiCLN+fxLqAKg3SipqNEL32zRC4u2yl1dJ0nq2ilON5zWS5efkHvstbX375DyP5bWvy9t/UYyvAees9ikjIFS9ggpZ4SUM1LKHEzQAgCICnwGRnNF4s/Mnf9erde+3aHf5vXT9Ly+ZpcDAACAKEKochSRODgA0Dxl1bX619Lt+udXW1Rc7pEkpSfG6tpTeuqXJ3ZXsjPm2J1UlkgbP/XPYtm+WKooOrwNQQsAIErwGRjNFYk/M9c8v0wL8ov0l58P1eUndDO7HAAAAEQRQpWjiMTBAYCWqa716s3vdmjWwh+1a3+VJCnJadfV43poysk9lJboaFpHhiG5d/uXB9u9Stq90n9+xKBlkJQzvD5sGSllDpFiWNsbABC5+AyM5orEn5lzH/9S611lemHKCTq9f4bZ5QAAACCKEKocRSQODgC0Tq3Xp/e/361/LNisTYXlkiRnjFVXjumm60/tpZxOLZhZEghaAgFLIGypLD68rdUudRnoD1pyRkrZgRktBC0AgMjAZ2A0VyT+zIz4f59qf2WtPrn1NPXPSjK7HAAAAEQRQpWjiMTBAYDQ8PkMffpDgf6xYJNW7yyVJMXYLPrZyK66cXxv9eqS2LpvYBiSe5c/YNmzyh+y7F515KDl4KXDCFoAACbiMzCaK9J+ZqprvRpwz1xJ0vf3nqOU+CYs9woAAAA0UXM+/9rDVBMAtDmr1aJzh2RpwuBMfb2pWE99sUlLfizRG9/t1JvLd+q8odm66fTeGpyT0rJvYLFIKcf5j4E/9V8LBi0rDwpbVvmDFtca/7Hy5foCDw5aRvrDlswhkr2Jy5QBAAB0UK7Sakn+2cjJcQxjAQAAYB4+jQKIOhaLRaf27aJT+3bR8m0l+scXmzV/faE+XL1HH67eozP6d9FNZ/TRCT1SQ/HNDgpaLvBfMwypdOfhe7RU7j1C0DKofjbLCIIWAACARrjc/lAlOyVOFovF5GoAAADQkRGqAIhqo7qnas41qVq3x62nF2zWB6t364v8In2RX6QxPVJ10xm9Nb5fl9AOzi0WqVOu/zg0aDl4j5Zg0LLaf+glf1trjH9GS86I+j1aRviXDiNoAQAAHVRgpkpmMp+HAAAAYC5CFQAdwsDsZP39ypGacXY/PfPlZr21fKeWbS3RsudL1DcjUecOydLZgzI1JCdFVmsb/PXjwUHLoAv91wxDKt1x+B4tVSUHgpYVhwYtIw/MaskYKMXEhb5WAACACBOYqZKVzP50AAAAMBehCoAOpUd6gmZePEzTz+qn2V/9qFeWbtfGwnJt/HyTnvh8kzKTHcobmKm8QZka1ytNzhhb2xVjsUiduvmPw4KWQ/ZoaRC0vBjoQOrcXUrvL3XpV//YX0rvJ8V1aru6AQAAwiwwUyUrhT8oAQAAgLkIVQB0SFkpTt3z00H6zZl9NX99gT5bV6CF+UUqcHv0r6Xb9a+l2xUfa9P4fl2UNzBTZwzIUGpCbNsX1iBouch/zTCk/dsP36Olap+0b6v/2PhJw34SM+sDloOCli79/ddZhxwAALQzwVCF5b8AAABgMkIVAB1aSnyMLj7+OF18/HHy1Hm1ePNefbauQJ/9UCiXu1ofr3Xp47UuWS3S6B6pOrt+FkvP9ITwFWmpn5HSuXvDoKWiSCrKl4rzpaIN9Y/5UtkeqbzAf2z5smFfjpSDZrUc9Nipu2Rtw1k5AAAArRBc/ouZKgAAADCZxTAMw+wiwsntdislJUWlpaVKTk42uxwAEcowDK3d5da8H1yat65Q6/a4GzzfJyNReQMzdfagTI3I7SRbW+zD0lLVpVLxxsMDl31bJcPX+D12p5TW58CMlsBjWh/Jzl+EAkB7x2dgNFek/cyMmzlfe0qr9e60kzUit5PZ5QAAACDKNOfzLzNVAKARFotFQ49L0dDjUjTjnP7aua9Sn/1QoM/WFWrJj3u1qbBcmwrLNWvhZqUnxurMARk6e1CWTumTrrhYk2d8OFOk40b7j4PVVkslm+vDlg0HHos3SnXVUsFa/3Ewi1Xq3KPxfVuc5v8DCwAAiH5en6HCMo8kNqoHAACA+QhVAKAJjuscr2tO7qlrTu4pd3WtFuQX6bMfCvRFfqGKy2v0xnc79cZ3O+WMseqUPl109qAMnTkgU12SImiWR4xTyhzsPw7m80r7tx20hNhBj55SqeRH/7Hh44b3JeU0spRYfymhC/u2AACAkCku98jrM2SzWiLrsxUAAAA6JEIVAGimZGeMLhyeowuH56jW69OyLSWa90OB5v1QoF37q/x7sqwrkMWyRiNyO+nsQZk6e2Cm+mQkyhKJYYPVJqX28h/9zz1w3TD8+7I0mNlSH7aUu6Sy3f7jxwUN+3N2ariEWCB0SekmWa3hfGUAACAK7KnfpL5LoiOyllwFAABAh0SoAgCtEGOz6uQ+6Tq5T7ruu2CQ1rvK6pcJK9D3O0u1cvt+rdy+Xw/PzVePtHjl1W90P7p7Z9ltER4wWCxSUpb/6DW+4XNV+w8PWorzpX3bpOr90o6l/uNg9jj/Hi1JmVJ8mv+IS5XiUw98HTxSJVtMuF4pAACIYK76UCUzhaW/AAAAYD5CFQAIEYvFooHZyRqYnaxbzuorV2m15q/3z2BZtGmvtu6t1D+/3qJ/fr1FneJjdGb/DJ09KFOn9uuiREc7+89xXCcpd4z/OFhtlbR30+H7tuzdJNVVSQVr/EdTOJIPD1yOFsLEpUq2dvY+AgCAYypw+0OVbPZTAQAAQATgX58AoI1kpTg1aWx3TRrbXRWeOn21sUif/lCgz9cXan9lrd5euUtvr9ylWJtV43qn6exBmcobmKms9vxXmDFxUtZQ/3Ewb51/35a9m6SKYqlyr/+oKpEqSw58XbnX/7UMyeP2H/u2Nv37O1OaHsLEp0lxnf3LnwEAgIgVWP6rXX9GAgAAQNQgVAGAMEhw2HXukGydOyRbdV6fVmzfr3k/uDTvhwJt3VuphRuKtHBDkf7w7loNOy7Fv0zYwEwNzE6KzH1Ymstml9J6+49j8Xml6tIDAUuDwOWga1UHPVe1z39vdan/KPmxiYVZ/LNuGoQwaYcHMQnpUlK2fyk0liUDACCsAjNVMpmpAgAAgAhAqAIAYWa3WTWmZ6rG9EzV3ecN1OaiCs2r34dlxfZ9Wr2zVKt3luqxeRvUtVNccAbL2F6pion0fVhCwWqrDzVSm36Pt86/l8uhwUtjXwfCmOpSSYY/kKna559Fc0wWKTFTSs6pP7oe8pgtJeVIMfyjDwAAoRLYUyWbmSoAAACIAIQqAGAii8WiPhmJ6pORqKmn91ZRmUdfrC/UvHUF+mpjkXbtr9ILi7bqhUVbleS06/T+GcobmKHT+2coJY4ZE0E2u382SUJ60+/x1vrDlEaDmENCmYoiqWyP5KuTyl3+Y/eKI/cdn3ZI2HJIAJOULTkSW/+6AQDoAFzMVAEAAEAEIVQBgAjSJcmhy07I1WUn5KqqxqtvNhXrs3UF+mxdoYrLPXr/+916//vdslstGpSTrH6ZSRqQlaT+WUnqn5mkLkmO6FguLBxsMVJihv9oCp/PH664d/kDFvdu/7l7d8PzuuoDYYxrzZH7c6QcFLg0Nuslx79HDP97AgA6MMMwmKkCAACAiEKoAgARKi7WprxBmcoblCmfz9Cqnfv12Q8FmvdDgTYWlgeXCTtY5/iYYMDSPytZ/bOS1C8zUUlOZrW0mtUqJWX6jyMx6pcTOzRoOfS8pkzylEpFpVLRuiP3F5PgX1LsaLNe4tMIXgAAUctdXaeqWq8kNqoHAABAZCBUAYB2wGq16PhunXV8t876/bkDtKOkUv/dXar1rjLlu8qUX1CmrcUV2ldZqyU/lmjJjyUN7u/aKc4ftmT5Z7b0y0xS7y6JirV3gD1awsliObAfTNaQI7erdtfPdjlC6OLe7d/7pbbCv9fL0fZ7scU2XFbs4NAlPlWyOSR77CGPDv9MncA5oQwAIEIFZqmkxMXIGWMzuRoAAACAUAUA2qXc1Hjlpsbr3CHZwWvVtV5tKiwPhiz59YGLy12tXfurtGt/lT5fXxhsb7da1KtLwkFLiCWrf2aSjuscJ6uVf2RvU85k/9Gl/5Hb1FY1DFkODl3K6h/LCyVvjbRvq/9oKWtMfdAS6z8ahC9HuHZoMBO8Ftvw/GjXjvRcTDxBDwBA0oH9VFj6CwAAAJGCUAUAooQzxqYhXVM0pGtKg+v7K2u0oaBc+S631rvKtKGgTOtdZSqrrtOGgnJtKCjXB6v3BNvHx9rULzOwhFj9zJasJKUnOsL9kjq2mDgprbf/OJK6GqncdUjoEpgBs0uqLpXqPP7g5eBHX23Dfny1Uk1t49/DDBabfz+ZuM5SXCf/o7PTkb8++DwmzsTCAQCh5iqtksQm9QAAAIgchCoAEOU6xcdqTM9UjemZGrxmGIb2lFY3mNGS7yrTpsJyVdZ4tWrHfq3asb9BP+mJsfV7tBxYQqxfZpISHPwqMY09VurUzX80h8/nD1IaBC4ef0jjrWnkmkfy1h5+Ldj+0GuBfg99znNQ/408J8Nfn+H1L39WVXLUl9H4e+I8egBzpK+dKZKNn2UAiDSuUo8kKYtQBQAAABGCfz0AgA7IYrEop1OccjrF6Yz+GcHrdV6ftu6tUL6r4cyWbSWVKi6vUfGmvfpm094GfXVLjT9oCTH/0TM9QTE29muJWFarZK1ftitSGIbk80p11ZKnTKreL1Xtk6rqH5vyteHz31/u8h/N5Ug+fObLEUOZg84dSSxXBgBtJLD8F5vUAwAAIFIQqgAAguw2q/pkJKlPRpLOH3Zgv5bKmjptLChvOLOloExFZR5tL6nU9pJKfbauINg+1mZVry4JwZAlMLOla6c4WfjHZzTGYvHPFLElSo5EKTn72PcczOeTasqaF8JU1R81Zf4+PG7/oe3N+95Wu3+mS0yCf/mxmDj/vjCHnR/62IznmEUDoIMKLP9FqAIAAIBIwQgdAHBM8bF2Dc/tpOG5nRpcL6mo0XqXWxvqQ5b1rjJtcJWposar9S7/1wdLdNjVPS1e3dPilZsar271R/fUBGV3cjK7BS1ntfqDDWeK1Ll78+711vr3n2lSCHPwc/v8S5n56qTKvZL2HuWbtJI15giBSyvDmhinPxQ64sH/JwGYy+Vm+S8AAABEFkIVAECLpSbE6qTe6Tqpd3rwmmEY2rmvKjibJb9+CbHNReUq99Tpv7vd+u9u92F92awW5XRyBoOWbqkJB53HKyU+JpwvDR2JLUZKSPcfzWEYUm3VgZCltkqqrTzCYwuvBfhqJU+p/wgri//9CYYstmOEMPXPB+85tL3NHxA11p8t5gjt7Qfdc1D/tlj/YXfUf+2o/zr2wHPB5w86t9rC/B4CaI0Clv8CAABAhCFUAQCElMViUW6qfyZK3qDM4PWaOp+27a3Qtr2VwSXDdpQcOPfU+bSjpEo7Sqr0TSN/8Z/stKt7mj9oaTDLJS1e2SlO2ZnlgnCzWKTYeP+RnBP6/g3Dv0dMs8Oa5gQ51f6ZNob3SEX4Z+N4a0L/+sxisR4lgAmcO44QzjQjvAm2jTnwXGyilDnI7HcAaDeqa70qqfD/94eZKgAAAIgUhCoAgLCItVvVNzNJfTOTDnvO5zNUVF6/P8veSm07JHApKvPIXV2nNbtKtWbX4X+pb7Na1LVTnD9oSYtvMMMlNzVeKXHMckE7ZLEcWLJLqW37vQxD8nn9AUvw8PpnyDT4uq7h4a1r5J7Aee0R+gzc29jzB7epPcL39R4IeupqDjr3HDhv8JznkNfqk+qq/Ien8bejzaT1kW5ZHuZvCrRfhfVLfznsVnVixioAAAAiBKEKAMB0VqtFmclOZSY7dUKPw//xuLKmTjtKqoIhy/a9FQdmu+yrUk2dL/i1Nh3ef6f4mMNnuNR/zSwXQP4Ax2b3H9HGMPxhzMGhS53HH+p4PYcHMN7aIzx/aNvG+qo9+vdJ7mr2uwG0K66Dlv6yWCwmVwMAAAD4ReHIGQAQbeJj7eqflaT+WY3Pciks82hbfdASmOESmO1SXF6j/ZW12l9ZqtU7D5/lYrda1LVzXIPZLYEApntavJKc/GUs0K5Z6veFsfH/ZaC92VNaJUnKZOkvAAAARBBCFQBAu2a1WpSV4lRWilNje6Ud9nyFp0479vmXFdte0vDYWVKlGq9P2/ZWatveykZ6lzrHxyg3NV6ZyU5lJfu/T+Axs/4x0cGvUwAAQi2wSX02m9QDAAAggvCvQACAqJbgsGtAVrIGZCUf9pzXZ6jAXX1gKbESf7gSON9bUaN9lbXaV1kq6fBZLgGJDrsykx3KTomrD1ocyko+ELpkJTuVluiQzcrSJQAANNWe0vrlv5ipAgAAgAhCqAIA6LBsVotyOsUpp1OcTmxklku5p0476gOWAne1XO5quUo9B51Xq9xT5z+K6rS5qOKI38tutSgjyaHM+pDl4MAlM9mp7PrZNs4YW1u+ZAAA2o3ATBWW/wIAAEAkIVQBAOAIEh12DcxO1sDsw2e5BJR76uQqrfYHLaX+sKXAXa09B10rKveozmdod2m1dtf/1e2RpMTF+IOWFKeykh31S43FKSvFEVyCLDUhlg17AQBRz1XK8l8AAACIPIQqAAC0QqLDrj4ZieqTkXjENnVen4rKPcHwZU8gfAmGMP7nqmq9Kq2qVWlVrfILyo7YX6zNqoz6wCUzxansQ/Z4yUp2KiPZIYedWS8AgPYrEKpkEqoAAAAgghCqAADQxuw2q7JT4pSdEnfENoZhyF1dd2CWS33g0jB8qVZxeY1qvD7t3Felnfuqjvp9UxNi1SXRoYxkh7okOtSl/jEj2Rm8npHkUKLDzswXAEBE8fkMFZZ5JLGnCgAAACILoQoAABHAYrEoJS5GKXEx6peZdMR2njqvCt0N93Xxn3tUUFqtPe4qFbg9qqnzqaSiRiUVNUed9SJJzhirMpKc6pLkD1kaPh64npbokM1K+AIAaHvFFf6lM60WqUuSw+xyAAAAgCBCFQAA2hGH3abc1HjlpsYfsY1hGNpXWavCsmoVuj0qKvOosMyjwrLq4Hlx/WO5p07VtT5tL6nU9pLKo35vq0VKTWgseHGoS5IzOCMmI9mh+Fg+YgAAWi6w9Fd6okMxNqvJ1QAAAAAH8C8eAABEGYvFotSEWKUmxGpA1tHbVtbUqajsQPBSdEj4Uuj2qKjco73lHvkMqbjco+Jyj7Tn6P0mxNqCy4x1SW585kuXJIdS42NlZfYLAOAQbFIPAACASEWoAgBABxYfa1f3NLu6pyUctZ3XZ2hvxYGQpaj+sdBdXf/oCT5W1XpVUePVluIKbSmuOGq/NqtF6YmxDcKWlPgYJTtjlOS0+w+H/zzRaQ9eT3TYZecvlwEgahW46zepZz8VAAAARBhCFQAAcEw2q0UZSU5lJB39H7cMw1BFjVeF7uqDZr40nAETOPZW1MjrM1Tg9qjA7Wl2TfGxtvrgJUaJDn8A0yCMOeh6kjNGyfWPgecTnXY57LaWviUAgDa0p36mShYzVQAAABBhCFUAAEDIWCwWJTrsSuySqF5dEo/attbr097ymsOWGyutqlW5p1Zl1XX1h//cXX/uqfNJkiprvKqs8bYokAmItVsPC1uSHDFKdB4axhxo4w9qDoQ0zhirLBaWMAOAUHK5CVUAAAAQmQhVAACAKWJsVmWlOJv9D2Y1dT6Vew4OWw4EMOWB8/rn3Yderw9mKmq8wb6Ky2tUXF7T4tdht1qU5LQrPtauuFib4mNtiovxPza4FmtTfIz9wHnwuj14T/B6jP++WDtLnAHomAJ7qmSx/BcAAAAiDKEKAABoV2LtVqXaY5WaENviPrw+Q+X1gYw/oDkQ0jQIYxqZMVN20H2GIdX5DO2rrNW+ytoQvko/u9VyUABjD4Y1Da7F2hQfc0hAc3BoUx/kHLju/9phZ4YNgMgVnKlCqAIAAIAIQ6gCAAA6HJvVopT4GKXEx7S4D5/PUGWtNxi2+Jcjq1NV/bJkVfVfV9Z6g9f81/1tq2obuVbjVWWtV16fIckf2ASCHKnly5w1xmqR4mJsctYfjhirnHZ/8OKsPw9cP9DuwHVnrE1OuzV4v/OQdo76dnH17ew2Zt0AaBrDMA7MVGH5LwAAAEQYQhUAAIAWsFrr949x2JWdEtq+a+p89QHLQWHLIaGNP6w59HmvqmrrDgprDrqnPsSpqd+TxmdIFTXe4FJobc1utTQIYA4OaeJibfUhjLWRgMY/q8YZYwtec9itstssirX5w5oYm0UxNqtibAdfP3At8LzdamF2DtAOlHn8/x2TCFUAAAAQeQhVAAAAIkys3apYu1UpavlMmiOp8/pUVT97pqrWq+paX/1j4PDJU+d/vrrWq+o6n6pr/W09tb4G7YL31fnkqfUe1I+/nac+wJH8s27KPXUq99SF/DU1R4zNIrv16EGM3WZV7CHndqtVMXarYqyW4D0NApvG7jkk1El2xuiUvummvn6gPSion6US2K8KAAAAiCR8QgUAAOhA7DarkmxWJTlDH9gcyucz5KkPZarr6oOYmsD5gZCm6qAgprrOq+qaA2HOoQGOpz70qfUaqvP5VOs1VOv1qdbrU53XUM1B53X1y6gdzN/eq6rQb4FzTL26JOjz350e/m8MtDOB/VSymaUCAACACESoAgAAgDZhtVoUF+tf3ssMhmEEQ5dA4FLn86m2zlCtr2EQU3dQOFPrNVTn9TW87jNUW+c7YpBz4P767+fzqaYuEPz4r+fwD8RAk8TarBrXK03dUuPNLgUAAAA4DKEKAAAAopLFYlGs3aJYu9XsUgA0w9heaXr1hjSzywAAAAAaxQgTAAAAAAAAAACgCQhVAAAAAAAAAAAAmiAiQpWnnnpKPXr0kNPp1NixY7Vs2bKjtn/zzTc1YMAAOZ1ODR06VB999FGYKgUAAAAAAAAAAB2V6aHK66+/rhkzZui+++7TihUrNHz4cE2YMEGFhYWNtl+0aJGuvPJKXXfddVq5cqUmTpyoiRMnau3atWGuHAAAAAAAAAAAdCQWwzAMMwsYO3asTjjhBD355JOSJJ/Pp9zcXN1yyy268847D2t/+eWXq6KiQh988EHw2oknnqgRI0Zo1qxZx/x+brdbKSkpKi0tVXJycuheCAAAABCh+AyM5uJnBgAAAB1Jcz7/mjpTpaamRsuXL1deXl7wmtVqVV5enhYvXtzoPYsXL27QXpImTJhwxPYej0dut7vBAQAAAACRornLIe/fv1/Tpk1Tdna2HA6H+vXrd9iSyM3tEwAAAEDTmBqqFBcXy+v1KjMzs8H1zMxMuVyuRu9xuVzNaj9z5kylpKQEj9zc3NAUDwAAAACt1NzlkGtqanT22Wdr69ateuutt5Sfn6/Zs2era9euLe4TAAAAQNOZvqdKW7vrrrtUWloaPHbs2GF2SQAAAAAgSXrsscd0/fXXa8qUKRo0aJBmzZql+Ph4Pffcc422f+6551RSUqJ3331XJ598snr06KHx48dr+PDhLe5TYoY/AAAA0FSmhirp6emy2WwqKChocL2goEBZWVmN3pOVldWs9g6HQ8nJyQ0OAAAAADBbS5ZDfu+99zRu3DhNmzZNmZmZGjJkiB588EF5vd4W9ykxwx8AAABoKlNDldjYWI0aNUrz588PXvP5fJo/f77GjRvX6D3jxo1r0F6S5s2bd8T2AAAAABCJWrIc8o8//qi33npLXq9XH330ke655x49+uijeuCBB1rcp8QMfwAAAKCp7GYXMGPGDF199dUaPXq0xowZo8cff1wVFRWaMmWKJGny5Mnq2rWrZs6cKUmaPn26xo8fr0cffVTnn3++XnvtNX333Xd69tlnzXwZAAAAANDmfD6fMjIy9Oyzz8pms2nUqFHatWuX/vrXv+q+++5rcb8Oh0MOhyOElQIAAADRyfRQ5fLLL1dRUZHuvfdeuVwujRgxQnPnzg3+ZdX27dtltR6YUHPSSSfplVde0R/+8Afdfffd6tu3r959910NGTLErJcAAAAAAM3WkuWQs7OzFRMTI5vNFrw2cOBAuVwu1dTUtKhPAAAAAE0XERvV33zzzdq2bZs8Ho+WLl2qsWPHBp9bsGCBXnjhhQbtL730UuXn58vj8Wjt2rU677zzwlwxAAAAALROS5ZDPvnkk7Vp0yb5fL7gtQ0bNig7O1uxsbEt6hMAAABA00VEqAIAAAAAHdGMGTM0e/Zsvfjii1q3bp2mTp162HLId911V7D91KlTVVJSounTp2vDhg368MMP9eCDD2ratGlN7hMAAABAy5m+/BcAAAAAdFTNXQ45NzdXn3zyiX77299q2LBh6tq1q6ZPn6477rijyX0CAAAAaDmLYRiG2UWEk9vtVkpKikpLS5WcnGx2OQAAAECb4zMwmoufGQAAAHQkzfn8y/JfAAAAAAAAAAAATUCoAgAAAAAAAAAA0ASEKgAAAAAAAAAAAE1AqAIAAAAAAAAAANAEhCoAAAAAAAAAAABNQKgCAAAAAAAAAADQBIQqAAAAAAAAAAAATUCoAgAAAAAAAAAA0ASEKgAAAAAAAAAAAE1gN7uAcDMMQ5LkdrtNrgQAAAAIj8Bn38BnYeBYGDcBAACgI2nOmKnDhSplZWWSpNzcXJMrAQAAAMKrrKxMKSkpZpeBdoBxEwAAADqipoyZLEYH+3M1n8+n3bt3KykpSRaLJezf3+12Kzc3Vzt27FBycnLYv39Hw/sdPrzX4cX7HT681+HF+x0+vNfhZfb7bRiGysrKlJOTI6uVFYBxbIybOg7e6/Di/Q4f3uvw4v0OH97r8OL9Dh+z3+vmjJk63EwVq9Wq4447zuwylJyczP8Rw4j3O3x4r8OL9zt8eK/Di/c7fHivw8vM95sZKmgOxk0dD+91ePF+hw/vdXjxfocP73V48X6HT3sYM/FnagAAAAAAAAAAAE1AqAIAAAAAAAAAANAEhCph5nA4dN9998nhcJhdSofA+x0+vNfhxfsdPrzX4cX7HT681+HF+w00D/+fCR/e6/Di/Q4f3uvw4v0OH97r8OL9Dp/29F53uI3qAQAAAAAAAAAAWoKZKgAAAAAAAAAAAE1AqAIAAAAAAAAAANAEhCoAAAAAAAAAAABNQKgCAAAAAAAAAADQBIQqYfbUU0+pR48ecjqdGjt2rJYtW2Z2SVFn5syZOuGEE5SUlKSMjAxNnDhR+fn5ZpfVYTz00EOyWCy69dZbzS4lKu3atUu//OUvlZaWpri4OA0dOlTfffed2WVFJa/Xq3vuuUc9e/ZUXFycevfurfvvv1+GYZhdWlT48ssvdcEFFygnJ0cWi0Xvvvtug+cNw9C9996r7OxsxcXFKS8vTxs3bjSn2HbuaO91bW2t7rjjDg0dOlQJCQnKycnR5MmTtXv3bvMKbueO9bN9sBtvvFEWi0WPP/542OoD2gPGTOHBuMk8jJnaHuOm8GDM1LYYM4UX46bwiYYxE6FKGL3++uuaMWOG7rvvPq1YsULDhw/XhAkTVFhYaHZpUWXhwoWaNm2alixZonnz5qm2tlbnnHOOKioqzC4t6n377bd65plnNGzYMLNLiUr79u3TySefrJiYGH388cf64Ycf9Oijj6pz585mlxaV/vKXv+jpp5/Wk08+qXXr1ukvf/mLHn74YT3xxBNmlxYVKioqNHz4cD311FONPv/www/r73//u2bNmqWlS5cqISFBEyZMUHV1dZgrbf+O9l5XVlZqxYoVuueee7RixQq9/fbbys/P14UXXmhCpdHhWD/bAe+8846WLFminJycMFUGtA+MmcKHcZM5GDO1PcZN4cOYqW0xZgovxk3hExVjJgNhM2bMGGPatGnBr71er5GTk2PMnDnTxKqiX2FhoSHJWLhwodmlRLWysjKjb9++xrx584zx48cb06dPN7ukqHPHHXcYp5xyitlldBjnn3++ce211za4dvHFFxuTJk0yqaLoJcl45513gl/7fD4jKyvL+Otf/xq8tn//fsPhcBivvvqqCRVGj0Pf68YsW7bMkGRs27YtPEVFsSO93zt37jS6du1qrF271ujevbvxt7/9Ley1AZGKMZN5GDe1PcZM4cG4KXwYM4UPY6bwYtwUPu11zMRMlTCpqanR8uXLlZeXF7xmtVqVl5enxYsXm1hZ9CstLZUkpaammlxJdJs2bZrOP//8Bj/jCK333ntPo0eP1qWXXqqMjAyNHDlSs2fPNrusqHXSSSdp/vz52rBhgyTp+++/19dff62f/OQnJlcW/bZs2SKXy9XgvycpKSkaO3YsvzPDoLS0VBaLRZ06dTK7lKjk8/l01VVX6fbbb9fgwYPNLgeIKIyZzMW4qe0xZgoPxk3hw5jJPIyZzMe4qe20hzGT3ewCOori4mJ5vV5lZmY2uJ6Zman169ebVFX08/l8uvXWW3XyySdryJAhZpcTtV577TWtWLFC3377rdmlRLUff/xRTz/9tGbMmKG7775b3377rX7zm98oNjZWV199tdnlRZ0777xTbrdbAwYMkM1mk9fr1Z///GdNmjTJ7NKinsvlkqRGf2cGnkPbqK6u1h133KErr7xSycnJZpcTlf7yl7/IbrfrN7/5jdmlABGHMZN5GDe1PcZM4cO4KXwYM5mHMZO5GDe1rfYwZiJUQVSbNm2a1q5dq6+//trsUqLWjh07NH36dM2bN09Op9PscqKaz+fT6NGj9eCDD0qSRo4cqbVr12rWrFkMDtrAG2+8oX/961965ZVXNHjwYK1atUq33nqrcnJyeL8RlWpra3XZZZfJMAw9/fTTZpcTlZYvX67//d//1YoVK2SxWMwuBwCCGDe1LcZM4cW4KXwYM6EjYtzUttrLmInlv8IkPT1dNptNBQUFDa4XFBQoKyvLpKqi280336wPPvhAX3zxhY477jizy4lay5cvV2FhoY4//njZ7XbZ7XYtXLhQf//732W32+X1es0uMWpkZ2dr0KBBDa4NHDhQ27dvN6mi6Hb77bfrzjvv1BVXXKGhQ4fqqquu0m9/+1vNnDnT7NKiXuD3Ir8zwycwMNi2bZvmzZvHX1u1ka+++kqFhYXq1q1b8Hfmtm3b9Lvf/U49evQwuzzAdIyZzMG4qe0xZgovxk3hw5jJPIyZzMG4qe21lzEToUqYxMbGatSoUZo/f37wms/n0/z58zVu3DgTK4s+hmHo5ptv1jvvvKPPP/9cPXv2NLukqHbWWWdpzZo1WrVqVfAYPXq0Jk2apFWrVslms5ldYtQ4+eSTlZ+f3+Dahg0b1L17d5Mqim6VlZWyWhv+mrTZbPL5fCZV1HH07NlTWVlZDX5nut1uLV26lN+ZbSAwMNi4caM+++wzpaWlmV1S1Lrqqqu0evXqBr8zc3JydPvtt+uTTz4xuzzAdIyZwotxU/gwZgovxk3hw5jJPIyZwo9xU3i0lzETy3+F0YwZM3T11Vdr9OjRGjNmjB5//HFVVFRoypQpZpcWVaZNm6ZXXnlF//nPf5SUlBRcSzIlJUVxcXEmVxd9kpKSDlt3OSEhQWlpaazHHGK//e1vddJJJ+nBBx/UZZddpmXLlunZZ5/Vs88+a3ZpUemCCy7Qn//8Z3Xr1k2DBw/WypUr9dhjj+naa681u7SoUF5erk2bNgW/3rJli1atWqXU1FR169ZNt956qx544AH17dtXPXv21D333KOcnBxNnDjRvKLbqaO919nZ2brkkku0YsUKffDBB/J6vcHfm6mpqYqNjTWr7HbrWD/bhw6+YmJilJWVpf79+4e7VCAiMWYKH8ZN4cOYKbwYN4UPY6a2xZgpvBg3hU9UjJkMhNUTTzxhdOvWzYiNjTXGjBljLFmyxOySoo6kRo/nn3/e7NI6jPHjxxvTp083u4yo9P777xtDhgwxHA6HMWDAAOPZZ581u6So5Xa7jenTpxvdunUznE6n0atXL+N//ud/DI/HY3ZpUeGLL75o9L/VV199tWEYhuHz+Yx77rnHyMzMNBwOh3HWWWcZ+fn55hbdTh3tvd6yZcsRf29+8cUXZpfeLh3rZ/tQ3bt3N/72t7+FtUYg0jFmCg/GTeZizNS2GDeFB2OmtsWYKbwYN4VPNIyZLIZhGKEMaQAAAAAAAAAAAKIRe6oAAAAAAAAAAAA0AaEKAAAAAAAAAABAExCqAAAAAAAAAAAANAGhCgAAAAAAAAAAQBMQqgAAAAAAAAAAADQBoQoAAAAAAAAAAEATEKoAAAAAAAAAAAA0AaEKAAAAAAAAAABAExCqAAAinsVi0bvvvmt2GQAAAAAQkRgzAUD4EKoAAI7qmmuukcViOew499xzzS4NAAAAAEzHmAkAOha72QUAACLfueeeq+eff77BNYfDYVI1AAAAABBZGDMBQMfBTBUAwDE5HA5lZWU1ODp37izJP8386aef1k9+8hPFxcWpV69eeuuttxrcv2bNGp155pmKi4tTWlqabrjhBpWXlzdo89xzz2nw4MFyOBzKzs7WzTff3OD54uJi/exnP1N8fLz69u2r9957r21fNAAAAAA0EWMmAOg4CFUAAK12zz336Oc//7m+//57TZo0SVdccYXWrVsnSaqoqNCECRPUuXNnffvtt3rzzTf12WefNRgAPP3005o2bZpuuOEGrVmzRu+995769OnT4Hv86U9/0mWXXabVq1frvPPO06RJk1RSUhLW1wkAAAAALcGYCQCih8UwDMPsIgAAkeuaa67R//3f/8npdDa4fvfdd+vuu++WxWLRjTfeqKeffjr43Iknnqjjjz9e//jHPzR79mzdcccd2rFjhxISEiRJH330kS644ALt3r1bmZmZ6tq1q6ZMmaIHHnig0RosFov+8Ic/6P7775fkH3QkJibq448/Zp1iAAAAAKZizAQAHQt7qgAAjumMM85oMACQpNTU1OD5uHHjGjw3btw4rVq1SpK0bt06DR8+PDg4kKSTTz5ZPp9P+fn5slgs2r17t84666yj1jBs2LDgeUJCgpKTk1VYWNjSlwQAAAAAIcOYCQA6DkIVAMAxJSQkHDa1PFTi4uKa1C4mJqbB1xaLRT6fry1KAgAAAIBmYcwEAB0He6oAAFptyZIlh309cOBASdLAgQP1/fffq6KiIvj8N998I6vVqv79+yspKUk9evTQ/Pnzw1ozAAAAAIQLYyYAiB7MVAEAHJPH45HL5WpwzW63Kz09XZL05ptvavTo0TrllFP0r3/9S8uWLdOcOXMkSZMmTdJ9992nq6++Wn/84x9VVFSkW265RVdddZUyMzMlSX/84x914403KiMjQz/5yU9UVlamb775Rrfcckt4XygAAAAAtABjJgDoOAhVAADHNHfuXGVnZze41r9/f61fv16S9Kc//UmvvfaabrrpJmVnZ+vVV1/VoEGDJEnx8fH65JNPNH36dJ1wwgmKj4/Xz3/+cz322GPBvq6++mpVV1frb3/7m2677Talp6frkksuCd8LBAAAAIBWYMwEAB2HxTAMw+wiAADtl8Vi0TvvvKOJEyeaXQoAAAAARBzGTAAQXdhTBQAAAAAAAAAAoAkIVQAAAAAAAAAAAJqA5b8AAAAAAAAAAACagJkqAAAAAAAAAAAATUCoAgAAAAAAAAAA0ASEKgAAAAAAAAAAAE1AqAIAAAAAAAAAANAEhCoAAAAAAAAAAABNQKgCAAAAAAAAAADQBIQqAAAAAAAAAAAATUCoAgAAAAAAAAAA0AT/H+iHPbDJYtyxAAAAAElFTkSuQmCC\n",
            "text/plain": [
              "<Figure size 2000x800 with 2 Axes>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "def plot_history(history):\n",
        "  \"\"\"\n",
        "    Plotting training and validation learning curves.\n",
        "\n",
        "    Args:\n",
        "      history: model history with all the metric measures\n",
        "  \"\"\"\n",
        "  fig, (ax1, ax2) = plt.subplots(1,2)\n",
        "  fig.set_size_inches(20, 8)\n",
        "\n",
        "  # Plot loss\n",
        "  ax1.set_title('Loss')\n",
        "  ax1.plot(history.history['loss'], label = 'train')\n",
        "  ax1.plot(history.history['val_loss'], label = 'test')\n",
        "  ax1.set_ylabel('Loss')\n",
        "\n",
        "  ax1.set_xlabel('Epoch')\n",
        "  ax1.legend(['Train', 'Validation'])\n",
        "\n",
        "  # Plot accuracy\n",
        "  ax2.set_title('Accuracy')\n",
        "  ax2.plot(history.history['accuracy'],  label = 'train')\n",
        "  ax2.plot(history.history['val_accuracy'], label = 'test')\n",
        "  ax2.set_ylabel('Accuracy')\n",
        "  ax2.set_xlabel('Epoch')\n",
        "  ax2.legend(['Train', 'Validation'])\n",
        "\n",
        "  plt.show()\n",
        "\n",
        "plot_history(history)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "kOgva0pbP4FS"
      },
      "source": [
        "Another way to view model performance, beyond just measuring loss and accuracy is to use a confusion matrix. The confusion matrix allows you to assess the performance of the classification model beyond accuracy. You can see what misclassified points get classified as. In order to build the confusion matrix for this multi-class classification problem, get the actual values in the test set and the predicted values.\n",
        "\n",
        "Start by generating the predicted class for each example in the validation set using [`Model.predict()`](https://www.tensorflow.org/api_docs/python/tf/keras/Model#predict)."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "PRUx5ao9QRcO"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "4/4 [==============================] - 0s 3ms/step\n"
          ]
        }
      ],
      "source": [
        "y_hat = classifier.predict(x=x_val)\n",
        "y_hat = np.argmax(y_hat, axis=1)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "CVidbr0OT5tL"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "{'sci.crypt': 0, 'sci.electronics': 1, 'sci.med': 2, 'sci.space': 3}"
            ]
          },
          "execution_count": 23,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "labels_dict = dict(zip(df_test['Class Name'], df_test['Encoded Label']))\n",
        "labels_dict"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "3ae76701e178"
      },
      "outputs": [
        {
          "data": {
            "image/png": "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iYhe27Rp06BQKODp6Yn09HR07twZcrkckyZNQmBgoKbDIyKSBNdZIiK1ZWVlISoqCqmpqXB3d4exsbGmQyIikgyTJSIiIqJicM4SEUnum2++wZw5czQdBhGRJNizRESS8/T0RExMDG7fvq3pUIiI1MZkiYiIiKgYHIYjIiIiKgaXDiCiUtm3bx98fHygp6eHffv2Fbtvr169yikqIqKyw2E4IioVHR0dPHr0CLa2ttDRKbpzWiaTITc3txwjIyIqG0yWiIiIiIrBOUtERERExWCyRESvbcyYMVi+fHmB8pUrV2LcuHHlHxARURlgskREr23Xrl3o0KFDgfL27dtj586dGoiIiEh6TJaI6LU9ffoUZmZmBcpNTU2RkJCggYiIiKTHZImIXpubmxsOHjxYoPy3336Dq6urBiIiIpIe11kiotc2YcIEBAQEID4+Hm+++SYAIDw8HF999RW+/vprDUdHRCQNLh1ARGoJDQ3F/PnzERsbCwBwcXHBrFmzMHDgQA1HRkQkDSZLRPTa/v33XwghYGRkhPj4eDx+/BhhYWFwd3eHt7e3psMjIpIE5ywR0Wt77733sGXLFgCAnp4eunfvjiVLlqB3794IDQ3VcHRERNJgskREr+3ixYvo1KkTAGDnzp2oUaMG7t69iy1bthS6/hIRUWXEZImIXlt6ejpMTEwAAIcPH0afPn2go6ODN954A3fv3tVwdERE0mCyRESvzc3NDXv37sX9+/dx6NAheHl5AQCePHkCU1NTDUdHRCQNJktE9NqCgoIwadIkODs7o23btmjXrh2AvF6m5s2bazg6IiJp8Go4IlLLo0ePEBcXh6ZNm0JHJ+/71++//w5TU1M0aNBAw9EREamPyRIRERFRMTgMR0RERFQMJktERERExWCyRERERFQMJktERERExWCyRESVwqBBg9C7d2/l465du2LcuHHlHsfx48chk8mQlJRU5D4ymQx79+4tcZ2zZ89Gs2bN1Irrzp07kMlkiIyMVKseIiqIyRIRvbZBgwZBJpNBJpNBX18fbm5umDNnDnJycsr83Lt378bcuXNLtG9JEhwioqJU03QARFS5vf3229i4cSMyMzNx4MABjB49Gnp6epg+fXqBfbOysqCvry/JeS0tLSWph4joVdizRERqkcvlsLOzg5OTE0aNGoXu3btj3759AP4bOps/fz4cHBxQ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\n",
            "text/plain": [
              "<Figure size 640x480 with 2 Axes>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "cm = skmetrics.confusion_matrix(y_val, y_hat)\n",
        "disp = skmetrics.ConfusionMatrixDisplay(confusion_matrix=cm,\n",
        "                              display_labels=labels_dict.keys())\n",
        "disp.plot(xticks_rotation='vertical')\n",
        "plt.title('Confusion matrix for newsgroup test dataset');\n",
        "plt.grid(False)"
      ]
    }
  ],
  "metadata": {
    "colab": {
      "name": "Classify_text_with_embeddings.ipynb",
      "toc_visible": true
    },
    "google": {
      "image_path": "/examples/train_text_classifier_embeddings_files/output_3ae76701e178_0.png",
      "keywords": [
        "examples",
        "googleai",
        "samplecode",
        "python",
        "embed"
      ]
    },
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}
